Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RtlCopyUnicodeString и IRQL


Страницы:   1 2 3

Riply ©   (2008-09-26 11:11:00) 

Здравствуйте !
В описании процедуры RtlCopyUnicodeString MSDN указывает следующее:
Requirements
IRQL: >= DISPATCH_LEVEL


Поясните, пожалуйста, что имеется ввиду ?
Неужели надо понимать буквально ?
(т.е. при IRQL < DISPATCH_LEVEL, с ней нельзя работать)


Riply   (2008-10-26 14:57:00) [1]

> [1] Rouse_ ©   (26.09.08 11:41)
> Но есть у меня тут кусочек драйвера, который тоже нормально работает:

Неа, это не "кусочек драйвера", а сплошные загадки :)
Давай начнем с азов:
Как я понимаю, структура pEProcess->Peb->ProcessParameters содержит
указатели, валидные только в рамках "подопытного" процесса. Это так ?
Если да, то каким образом, мы так спокойно гуляем по этим указателям, чего-то там читаем
(например, pEProcess->Peb->ProcessParameters->ImagePathName.Buffer) и при этом не получаем BSOD ?


slow!alfamoon!com   (2008-10-07 11:39:00) [2]

wrk не сильно большой (метров 30). Но полезный


Rouse_   (2008-10-07 10:31:00) [3]


> актуальна только для W2k

Начиная с...


> а почему в твоем "кусочке драйвера" нет вызова ObDereferenceObject?  

Он вызывается в GetUserSIDFromProcess


Игорь Шевченко   (2008-10-06 19:46:00) [4]


> К сожалению, мне не так просто "заиметь". Интернета у меня
> такая, однако :(


ну один раз можно и 300 метров выкачать. Оно все равно полезней, чем на форум трафик тратить :)


Riply   (2008-10-06 19:05:00) [5]

> [40] Игорь Шевченко ©   (06.10.08 12:14)
> лучше windbg все равно ничего нету. оно (windbg) показывает типы для конкретной системы
> (точнее для той, для которой у него есть символы). Структура факт меняется, у win2003 она отличается от XP, у висты наверное тоже.

В этом я уже убедилась, правда, пока, заочно :)

> [41] Rouse_ ©   (06.10.08 12:30)
> Да кстати... Приведенная мной структура актуальна для W2k

В смысле "актуальна и для W2k" или "актуальна только для W2k" ?
P.S.
Понимаю, что второе, но чем черт не шутит :)

P.P.S.
Саш, а почему в твоем "кусочке драйвера" нет вызова ObDereferenceObject ?  

> [42] slow!alfamoon!com   (06.10.08 18:39)
> Ой. WinDBG надо, разумеется. В ДДК может не оказаться кое чего. + WRK заимей

К сожалению, мне не так просто "заиметь". Интернета у меня такая, однако :(


slow!alfamoon!com   (2008-10-06 18:39:00) [6]

Ой. WinDBG надо, разумеется. В ДДК может не оказаться кое чего. + WRK заимей


Rouse_   (2008-10-06 12:30:00) [7]


> Структура факт меняется, у win2003 она отличается от XP,
>  у висты наверное тоже.

Да кстати... Приведенная мной структура актуальна для W2k


Игорь Шевченко   (2008-10-06 12:14:00) [8]

лучше windbg все равно ничего нету. оно (windbg) показывает типы для конкретной системы (точнее для той, для которой у него есть символы). Структура факт меняется, у win2003 она отличается от XP, у висты наверное тоже.


Rouse_   (2008-10-06 12:07:00) [9]


> Если нет, до дай мне, пожалуйста, твой вариант

typedef struct _EPROCESS {
   KPROCESS Pcb;
   NTSTATUS ExitStatus;
   KEVENT LockEvent;
   ULONG LockCount;
   LARGE_INTEGER CreateTime;
   LARGE_INTEGER ExitTime;
   PKTHREAD LockOwner;

   HANDLE UniqueProcessId;

   LIST_ENTRY ActiveProcessLinks;

   //
   // Quota Fields
   //

   SIZE_T QuotaPeakPoolUsage[2];
   SIZE_T QuotaPoolUsage[2];

   SIZE_T PagefileUsage;
   SIZE_T CommitCharge;
   SIZE_T PeakPagefileUsage;

   //
   // VmCounters
   //

   SIZE_T PeakVirtualSize;
   SIZE_T VirtualSize;

   MMSUPPORT Vm;
   LIST_ENTRY SessionProcessLinks;

   PVOID DebugPort;
   PVOID ExceptionPort;
   PHANDLE_TABLE ObjectTable;

   //
   // Security
   //

   PACCESS_TOKEN Token;         // This field must never be null

   //

   FAST_MUTEX WorkingSetLock;
   PFN_NUMBER WorkingSetPage;
   BOOLEAN ProcessOutswapEnabled;
   BOOLEAN ProcessOutswapped;
   UCHAR AddressSpaceInitialized;
   BOOLEAN AddressSpaceDeleted;
   FAST_MUTEX AddressCreationLock;
   KSPIN_LOCK HyperSpaceLock;
   struct _ETHREAD *ForkInProgress;
   USHORT VmOperation;
   UCHAR ForkWasSuccessful;
   UCHAR MmAgressiveWsTrimMask;
   PKEVENT VmOperationEvent;
   PVOID PaeTop;
   ULONG LastFaultCount;
   ULONG ModifiedPageCount;
   PVOID VadRoot;
   PVOID VadHint;
   PVOID CloneRoot;
   PFN_NUMBER NumberOfPrivatePages;
   PFN_NUMBER NumberOfLockedPages;
   USHORT NextPageColor;
   BOOLEAN ExitProcessCalled;

   //
   // Used by Debug Subsystem
   //

   BOOLEAN CreateProcessReported;
   HANDLE SectionHandle;

   //
   // Peb
   //

   PPEB Peb;
   PVOID SectionBaseAddress;

   PEPROCESS_QUOTA_BLOCK QuotaBlock;
   NTSTATUS LastThreadExitStatus;
   PPAGEFAULT_HISTORY WorkingSetWatch;
   HANDLE Win32WindowStation;
   HANDLE InheritedFromUniqueProcessId;
   ACCESS_MASK GrantedAccess;
   ULONG DefaultHardErrorProcessing;
   PVOID LdtInformation;
   PVOID VadFreeHint;
   PVOID VdmObjects;
   PVOID DeviceMap;

   //
   // Id of the Hydra session in which this process is running
   //

   ULONG SessionId;

   LIST_ENTRY PhysicalVadList;
   union {
       HARDWARE_PTE PageDirectoryPte;
       ULONGLONG Filler;
   };
   ULONG PaePageDirectoryPage;
   UCHAR ImageFileName[ 16 ];
   ULONG VmTrimFaultValue;
   BOOLEAN SetTimerResolution;
   UCHAR PriorityClass;
   union {
       struct {
           UCHAR SubSystemMinorVersion;
           UCHAR SubSystemMajorVersion;
       };
       USHORT SubSystemVersion;
   };
   PVOID Win32Process;
   struct _EJOB *Job;
   ULONG JobStatus;
   LIST_ENTRY JobLinks;
   PVOID LockedPagesList;

   //
   // Used by rdr/security for authentication
   //

   PVOID SecurityPort ;              
   PWOW64_PROCESS Wow64Process;

   LARGE_INTEGER ReadOperationCount;
   LARGE_INTEGER WriteOperationCount;
   LARGE_INTEGER OtherOperationCount;
   LARGE_INTEGER ReadTransferCount;
   LARGE_INTEGER WriteTransferCount;
   LARGE_INTEGER OtherTransferCount;

   SIZE_T CommitChargeLimit;
   SIZE_T CommitChargePeak;

   LIST_ENTRY ThreadListHead;

   PRTL_BITMAP VadPhysicalPagesBitMap;
   ULONG_PTR VadPhysicalPages;
   KSPIN_LOCK AweLock;
} EPROCESS;

#define PS_JOB_STATUS_NOT_REALLY_ACTIVE      0x00000001
#define PS_JOB_STATUS_ACCOUNTING_FOLDED      0x00000002
#define PS_JOB_STATUS_NEW_PROCESS_REPORTED   0x00000004
#define PS_JOB_STATUS_EXIT_PROCESS_REPORTED  0x00000008
#define PS_JOB_STATUS_REPORT_COMMIT_CHANGES  0x00000010
#define PS_JOB_STATUS_LAST_REPORT_MEMORY     0x00000020

typedef EPROCESS *PEPROCESS;


Riply   (2008-10-06 11:36:00) [10]

> [37] slow!alfamoon!com   (06.10.08 11:29)
> У тебя DDK нет, что ли?

Есть..., вроде..., но... наверное, какой-то не очень правильный.
Например, струкруры EPROCESS я в нем не нашла.


slow!alfamoon!com   (2008-10-06 11:29:00) [11]

Riply
тут дело в том, что полностью доверять реактосу - нельзя. У них в некоторых случаях встречаются несоответствия с win (что вполне понятно). У тебя DDK нет, что ли?


Riply   (2008-10-06 11:04:00) [12]

> [35] Игорь Шевченко ©   (06.10.08 10:05)
> для рассмотрения структур EPROCESS, KPROCESS и прочих рекомендую скачать и установить Debugging Tools for Windows

Спасибо.

P.S.
Т.е. все что мы с вместе кошкой делали (возились с EPROCESS) можно отправить "коту под хвост" ? :)


Игорь Шевченко   (2008-10-06 10:05:00) [13]

для рассмотрения структур EPROCESS, KPROCESS и прочих рекомендую скачать и установить Debugging Tools for Windows (с www.microsoft.com), скачать отладочные символы (насколько я знаю, именно скачать, а не настроить сервер символов) и в windbg в режиме локальной отладки ядра сказать dt nt!_EPROCESS


Riply   (2008-10-06 09:08:00) [14]

> [33] Riply ©   (06.10.08 06:41)

Уфф...
При помощи моей кошки, чертовой бабушки и калькулятора,
вроде удалось все привести к "правильному" виду. :)
Но проверка, все-равно, не помешает.
"Меня терзают смутные сомнения", что это безобразие может быть разным, даже в разных сервис паках.


Riply   (2008-10-06 06:41:00) [15]

> [1] Rouse_ ©   (26.09.08 11:41)
> Но есть у меня тут кусочек драйвера, который тоже нормально работает:

Появилось чуть свободного времени - решила посмотреть твой "кусочек драйвера".
Разумеется, сразу появилась проблемма. Ну как же без них то :)
Как у тебя определяется структура _EPROCESS ?
Я посмотрела ее в двух источниках, пользующхся моим наибольшим доверием (ReactOS и линуксоиды).
У них определения разные, причем разница - критична.
Неприятности начинаются еще с _KPROCESS:
У ReactOS она заканчивается такими полями:
UCHAR ThreadSeed; /* 066 */
UCHAR DisableBoost; /* 067 */
} KPROCESS;

а у линуксоидов добавлено еще четыре поля:
UCHAR PowerState;
BOOLEAN DisableQuantum;
UCHAR IdealNode;
UCHAR Spare;
} KPROCESS, *PKPROCESS;

Как результат _EPROCESS у них начинает различаться уже с первых полей,
а дальше - хуже. С новыми полями разница в смещении только растет.
(например у поля UniqueProcessId это уже $84 против $94 )
Приведу кусочек от линуксоидов (он мне больше нравиться :) )
typedef struct _EPROCESS {
   KPROCESS                        Pcb; // +0x000
   EX_PUSH_LOCK                    ProcessLock; // +0x06c
   LARGE_INTEGER                   CreateTime; // +0x070
   LARGE_INTEGER                   ExitTime; // +0x078
   EX_RUNDOWN_REF                  RundownProtect; // +0x080
   ULONG                           UniqueProcessId; // +0x084
   LIST_ENTRY                      ActiveProcessLinks; // +0x088
   ULONG                           QuotaUsage[3]; // +0x090
   ULONG                           QuotaPeak[3]; // +0x09c
   ULONG                           CommitCharge; // +0x0a8
   ULONG                           PeakVirtualSize; // +0x0ac
   ULONG                           VirtualSize; // +0x0b0
   LIST_ENTRY                      SessionProcessLinks; // +0x0b4
   PVOID                           DebugPort; // +0x0bc
   PVOID                           ExceptionPort; // +0x0c0
   PHANDLE_TABLE                   ObjectTable; // +0x0c4
   EX_FAST_REF                     Token; // +0x0c8
   ULONG                           WorkingSetPage; // +0x0cc
   KGUARDED_MUTEX                  AddressCreationLock; // +0x0d0
   ULONG                           HyperSpaceLock; // +0x0f0
   PETHREAD                        ForkInProgress; // +0x0f4
   ULONG                           HardwareTrigger; // +0x0f8
   PMM_AVL_TABLE                   PhysicalVadRoot; // +0x0fc
   PVOID                           CloneRoot; // +0x100
   ULONG                           NumberOfPrivatePages; // +0x104
   ULONG                           NumberOfLockedPages; // +0x108
   PVOID                           Win32Process; // +0x10c
   PEJOB                           Job; // +0x110
   PVOID                           SectionObject; // +0x114
   PVOID                           SectionBaseAddress; // +0x118
   PEPROCESS_QUOTA_BLOCK           QuotaBlock; // +0x11c
   PPAGEFAULT_HISTORY              WorkingSetWatch; // +0x120
   PVOID                           Win32WindowStation; // +0x124
   ULONG                           InheritedFromUniqueProcessId; // +0x128
   PVOID                           LdtInformation; // +0x12c
   PVOID                           VadFreeHint; // +0x130
   PVOID                           VdmObjects; // +0x134
   PVOID                           DeviceMap; // +0x138
   PVOID                           Spare0[3]; // +0x13c
   union {
       HARDWARE_PTE                PageDirectoryPte; // +0x148
       UINT64                      Filler; // +0x148
   };
   PVOID                           Session; // +0x150
   UCHAR                           ImageFileName[16]; // +0x154
   LIST_ENTRY                      JobLinks; // +0x164
   PVOID                           LockedPagesList; // +0x16c
   LIST_ENTRY                      ThreadListHead; // +0x170
   PVOID                           SecurityPort; // +0x178
   PVOID                           PaeTop; // +0x17c
   ULONG                           ActiveThreads; // +0x180
   ULONG                           GrantedAccess; // +0x184
   ULONG                           DefaultHardErrorProcessing; // +0x188
   SHORT                           LastThreadExitStatus; // +0x18c
   PPEB                            Peb; // +0x190
   EX_FAST_REF                     PrefetchTrace; // +0x194
   LARGE_INTEGER                   ReadOperationCount; // +0x198
   LARGE_INTEGER                   WriteOperationCount; // +0x1a0
   LARGE_INTEGER                   OtherOperationCount; // +0x1a8
   LARGE_INTEGER                   ReadTransferCount; // +0x1b0
   LARGE_INTEGER                   WriteTransferCount; // +0x1b8
   LARGE_INTEGER                   OtherTransferCount; // +0x1c0
   ULONG                           CommitChargeLimit; // +0x1c8
   ULONG                           CommitChargePeak; // +0x1cc
   PVOID                           AweInfo; // +0x1d0

Собираюсь взять их данные за основу.
У тебя такие же смещения или нет ?
Если нет, до дай мне, пожалуйста, твой вариант - буду брать среднее-арифметические смещения :)


Германн   (2008-09-29 02:11:00) [16]


> Вот для того чтобы избежать таких “чудесных” самопальных
> решений (хоть и рабочих) – нужны книги, даже того же Фленова.
>
> <Цитата>
>
> Игорь Шевченко ©   (29.09.08 02:00) [31]
>
> Нет, Софт, книги Фленова не нужны, потому что они вредны.
>  Они учат шаблонам. А овладение шаблонами еще не знание
> и уж тем более, не повод для наездов на MS.
>

И в добавок. Они учат шаблонам содержащим ошибки. А ученик выучивший эти шаблоны об этих ошибках и не знает ничего.


Игорь Шевченко   (2008-09-29 02:00:00) [17]

Нет, Софт, книги Фленова не нужны, потому что они вредны. Они учат шаблонам. А овладение шаблонами еще не знание и уж тем более, не повод для наездов на MS.


Городской Шаман   (2008-09-28 15:53:00) [18]

А по документации учится не сложно, но часто можно допустить такие ошибки, которые мастеру бы и голову не пришли. Вот лично моё решение, когда я учился разработке БД и SQL на живом и до сих пор работающем проекте.

Данные одной системной утилиты извлекались и сохранялись в базу Access. SQL на нужном уровне я изучил по документации Delphi примерам и документации Access, коннект к базе создавался через ODBC (подсмотрел в реестре).

Но была проблемка - данные не всегда после сохранения оказывались в базе.

Как вы думаете, в чем?

Оказалось проблема в транзакциях!!! Точнее, в комите, я привык работать с ФС-базами (в институте), там необходимости в комите не было (это сейчас знаю что это, а тогда не знал и инет был фиговый).

Как я ее решил – Положил на форму таймер, который выполнял раз в секунду вот этот код:

procedure TNTDForm.TimerNtdTimer(Sender: TObject);
begin
 TimerNtd.Enabled:=False;
 CsGraphMainForm.SDDatabase1.StartTransaction;
 CsGraphMainForm.SDDatabase1.Commit;
 TimerNtd.Enabled:=True;
end;


И проблема чудесным образом разрешилась, просто тогда я считал по аналогии с файл-серверными, что комит нужен для сброса буфера базы на диск.

А данная программа используется и работает по сей день.

Вот для того чтобы избежать таких “чудесных” самопальных решений (хоть и рабочих) – нужны книги, даже того же Фленова.


Городской Шаман   (2008-09-28 15:44:00) [19]


> Игорь Шевченко ©   (28.09.08 11:08) [28]
>
> Городской Шаман   (28.09.08 06:37) [27]
>
> > Если установить девайсину от Dlink на компьютер, то как
> > минимум раз в день синий экран гарантирован.
>
> Оно конечно смешно, но именно у меня стояли девайсины от
> DLink - а именно сетевые платы. Работали как часы, с момента
> установки.
>
> Ты руки не пробовал выпрямить ?


Значит вам повезло с моделью. У Dlink встречается нормальное оборудование типа DWL-2100AP, но такое бывает в процентах 20 случаев.


> Игорь Шевченко ©   (28.09.08 11:08) [28]
>
> > Это тоже самое что Delphi учить по help-у, не прочитав
> ни
> > одной книжки перед этим.
>
>
> Конечно тоже смешно, но я прошел именно такой путь - изучал
> Delphi не прочитав ни одной книжки - по одной простой причине
> - их, книжек, еще не успели написать, ну и напечатать тоже.
>  Ты как думаешь вообще - авторы, которые эти книжки писали,
>  тоже ждали, пока на них первокнига не снизойдет ?


Нет не думаю. Но думаю, что если WDM модель была создана в 98, NT в 96 и IFS модель драйвера тоже где-то в 96, то авторы этих книг имели намного больше времени, чем я, чтобы изучить тонкости работы драйверов в системе Windows. Ну а так как мне именно сейчас понадобилось разобраться в разработке драйверов, то я лучше часть граблей обойду и воспользуюсь опытом этих авторов.

Так как драйвера (резидентные обработчики прерываний) я разрабатывал только под DOS, то ввиду несколько отличающейся модели драйвера в Windows (которому более подходит название плагин ядра) мне проще основы изучить по книге.

А по документации учится не сложно, но часто можно допустить такие ошибки которые мастеру бы и голову не пришли. Вот лично моё решение, когда я учился разработке БД и SQL на живом и до сих пор работающем проекте.

Данные одной системной утилиты извлекались и сохранялись в базу Access. SQL на нужном уровне я изучил по документации Delphi примерам и документации Access, коннект к базе создавался через ODBC (подсмотрел в реестре).
Но была проблемка - данные не всегда после сохранения оказывались в базе. Как вы думаете в чем?


Игорь Шевченко   (2008-09-28 11:08:00) [20]

Городской Шаман   (28.09.08 06:37) [27]


> Если установить девайсину от Dlink на компьютер, то как
> минимум раз в день синий экран гарантирован.


Оно конечно смешно, но именно у меня стояли девайсины от DLink - а именно сетевые платы. Работали как часы, с момента установки.

Ты руки не пробовал выпрямить ?


> Это тоже самое что Delphi учить по help-у, не прочитав ни
> одной книжки перед этим.


Конечно тоже смешно, но я прошел именно такой путь - изучал Delphi не прочитав ни одной книжки - по одной простой причине - их, книжек, еще не успели написать, ну и напечатать тоже. Ты как думаешь вообще - авторы, которые эти книжки писали, тоже ждали, пока на них первокнига не снизойдет ?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо