![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RtlCopyUnicodeString и IRQL
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 не прочитав ни одной книжки - по одной простой причине - их, книжек, еще не успели написать, ну и напечатать тоже. Ты как думаешь вообще - авторы, которые эти книжки писали, тоже ждали, пока на них первокнига не снизойдет ?