Знающие люди, помогите! Хочу перехватить функцию NtCreateProcess Windows XP, но ничего не получилось, причем она даже не вызывается. Потом прочитал, что эта функция в XP не используется, а есть NtCreateProcessEx. Пытаюсь перехватить ее, но при перехвате комп перезагружается. Драйвер рабочий- для других функций все отлично работает. В чем дело, не знаю.
Товарищи меня тоже очень интересует этот вопрос. может кто то поможет. Предыдущее предлжение тоже не помогло.
я попробовал через NtCreateSection впринципе работает, но мне нужно вывести PID процесса-прародителя(он выводится нормально через PsGetCurrentProcessId()) и имя исполняемого файла порождаемого процесса(я хочу через ObjectAttributes->ObjectName). Но тут возникает опять проблема: как только я обращаюсь к полю ObjectAttributes->ObjectName возникает BSOD Не пойму в чем дело
Вот код , кот я использую для NtCreateProcessEx: cpp: Код (Text): // DriverEntry Главная точка входа в драйвер // UnloadRoutine Процедура выгрузки драйвера // DeviceControlRo ine Обработчик DeviceIoControl IRP пакетов #include "Driver.h" // Предварительные объявления функций: NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject); NTSTATUS ReadWrite_IRPhandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS Create_File_IRPprocessing(IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS Close_HandleIRPprocessing(IN PDEVICE_OBJECT fdo, IN PIRP Irp); int d; KSPIN_LOCK MySpinLock; //Индекс OldCreateProcessEx в таблице SST Windows XP //Индекс OldCreateProcessEx) в таблице SST Win2k #define INDEX_IN_SST_IN_XP 0x30 DEVICE_BUFFER buf[3]; //Дай бог чоть кто-нить её вызвал! int Counter=0; //счетчик вызовов int CURRENT_INDEX = INDEX_IN_SST_IN_XP ; //У мен int CountCall = 0; UNICODE_STRING UniFileName; //временные строки Unicode ANSI_STRING AnsiFileName; //и ANSI, NTSTATUS stat; //временные переменные stat int len; //и len -- для преобразования имени файла из UNICODE в char* NtCreateProcessEx OldCreateProcessEx; NTSTATUS NewNtCreateProcessEx( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE InheritFromProcessHandle, IN BOOLEAN InheritHandles, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL, IN HANDLE Unknown ) { int size = 0; int ret; HANDLE PID; size = ObjectAttributes->ObjectName->Length / sizeof(WCHAR); PID = PsGetCurrentProcessId(); DbgPrint("-Example=Id of Proceeeeeeeess =%d\n",PID); if (Counter<3) { UniFileName.Buffer = (PWSTR) ExAllocatePool( NonPagedPool, ObjectAttributes->ObjectName->MaximumLength/*Length + sizeof(WCHAR))*/); UniFileName.MaximumLength = ObjectAttributes->ObjectName->MaximumLength/*Length + sizeof(WCHAR)*/; RtlCopyUnicodeString( &UniFileName, ObjectAttributes->ObjectName ); stat = RtlUnicodeStringToAnsiString( &AnsiFileName, &UniFileName, TRUE); if (NT_SUCCESS(stat)) { len = (AnsiFileName.Length > 255? 255 : AnsiFileName.MaximumLength/*Length*/); strncpy( buf[Counter].FileName, AnsiFileName.Buffer /*+ 4*/, //+4 -- для удаления из начала строки последовательности "\??\" len); buf[Counter].FileName[len+1] = 0; DbgPrint("-Example=NAME of Proceeeeeeeess =%s\n",buf[Counter].FileName); } buf[Counter++].PID = PID; DbgPrint("-Example=Id of Proceeeeeeeess =%d\n",buf[Counter-1].PID); } else DbgPrint("Malo Mesta v Buffere\n"); ret=((NtCreateProcessEx)(OldCreateProcessEx)) ( ProcessHandle, DesiredAccess, ObjectAttributes, InheritFromProcessHandle, InheritHandles, SectionHandle, DebugPort, ExceptionPort, Unknown ); return ret; } #pragma code_seg("INIT") // начало секции INIT ///////////////////////////////////////////////////////////////////// // (Файл init.cpp) // DriverEntry - инициализация драйвера и необходимых объектов // Аргументы: указатель на объект драйвера // раздел реестра (driver service key) в UNICODE // Возвращает: STATUS_Xxx extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS status = STATUS_SUCCESS; PDEVICE_OBJECT fdo; UNICODE_STRING devName; //PDEVICE_EXTENSION PDEx; ULONG CR0Reg; ULONG i; #if DBG DbgPrint("=Example= In DriverEntry."); DbgPrint("=Example= RegistryPath = %ws.", RegistryPath->Buffer); #endif // Экспорт точек входа в драйвер (AddDevice объявлять не будем) // DriverObject->DriverExtension->AddDevice= OurAddDeviceRoutine; DriverObject->DriverUnload = UnloadRoutine; DriverObject->MajorFunction[IRP_MJ_CREATE]= Create_File_IRPprocessing; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Close_HandleIRPprocessing; DriverObject->MajorFunction[IRP_MJ_READ] = ReadWrite_IRPhandler; DriverObject->MajorFunction[IRP_MJ_WRITE] = ReadWrite_IRPhandler; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]= DeviceControlRoutine; //======================================================== // Действия по созданию символьной ссылки // (их нужно было бы делать в OurAddDeviceRoutine, но у нас // очень простой драйвер и эта процедура отсутствует): RtlInitUnicodeString( &devName, L"\\Device\\EXAMPLE" ); // Создаем наш Functional Device Object (FDO) и получаем // указатель на созданный FDO в нашей переменной fdo. // (В WDM драйвере эту работу также следовало бы выполнять // в процедуре OurAddDeviceRoutine.) При создании FDO // будет выделено место и под структуру расширения устройства // EXAMPLE_DEVICE_EXTENSION (для этого мы передаем в вызов // ее размер, вычисляемый оператором sizeof): status = IoCreateDevice(DriverObject, sizeof(_DEVICE_EXTENSION), &devName, // может быть и NULL FILE_DEVICE_UNKNOWN, 0, TRUE, // c эксклюзивного доступа &fdo); if(!NT_SUCCESS(status)) return status; // Получаем указатель на область, предназначенную под // структуру расширение устройства PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension; dx->fdo = fdo; // Сохраняем обратный указатель // Применяя прием условной компиляции, вводим функцию DbgPrint, // сообщения которой мы сможем увидеть в окне DebugView, если // выполним сборку нашего драйвера как checked (отладочную) // версию: #if DBG DbgPrint("=Example= FDO %X, DevExt=%X.",fdo,dx); #endif //======================================= // Действия по созданию символьной ссылки // (их нужно было бы делать в OurAddDeviceRoutine, но у нас // очень простой драйвер): UNICODE_STRING symLinkName; // Сформировать символьное имя: // #define SYM_LINK_NAME L"\\??\\Example" // Такого типа символьные ссылки ^^ проходят только в NT. // (То есть, если перенести бинарный файл драйвера в // Windows 98, то пользовательские приложения заведомо // не смогут открыть файл по такой символьной ссылке.) // Для того, чтобы ссылка работала в и Windows 98 и в NT, // необходимо поступать следующим образом: #define SYM_LINK_NAME L"\\DosDevices\\Example" RtlInitUnicodeString( &symLinkName, SYM_LINK_NAME ); dx->SymLinkName = symLinkName; // Создаем символьную ссылку status = IoCreateSymbolicLink( &symLinkName, &devName ); if (!NT_SUCCESS(status)) { // при неудаче v удалить Device Object и вернуть управление IoDeleteDevice( fdo ); return status; } // Теперь можно вызывать CreateFile("\\\\.\\Example",...); // в пользовательских приложениях // Объект спин-блокировки, который будем использовать для // разнесения во времени выполнения кода обработчика // IOCTL запросов. Инициализируем его: (NtCreateProcessEx)dx->OriginalFunc=(NtCreateProcessEx)NTCALL(CURRENT_INDEX); OldCreateProcessEx=dx->OriginalFunc; __asm { cli mov eax, cr0 mov CR0Reg,eax and eax,0xFFFEFFFF //сбросить WP bit mov cr0, eax } NTCALL(CURRENT_INDEX)=NewNtCreateProcessEx; __asm { mov eax, CR0Reg mov cr0, eax //востановить содержимое CR0 sti //разрешаем прерывания } KeInitializeSpinLock(&MySpinLock); // Снова используем условную компиляцию, чтобы выделить код, // компилируемый в отладочной версии и не компилируемый в // версии free (релизной): #if DBG DbgPrint("=Example= DriverEntry successfully completed."); #endif return status; } #pragma code_seg() // end INIT section // // (Файл init.cpp) // CompleteIrp: Устанавливает IoStatus и завершает обработку IRP // Первый аргумент - указатель на объект нашего FDO. // NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info) { Irp->IoStatus.Status = status; Irp->IoStatus.Information = info; IoCompleteRequest(Irp,IO_NO_INCREMENT); return status; } // // (Файл init.cpp) // ReadWrite_IRPhandler: Берет на себя обработку запросов // чтения/записи и завершает обработку IRP вызовом CompleteIrp // с числом переданных/полученных байт (BytesTxd) равным нулю. // Аргументы: // Указатель на объект нашего FDO // Указатель на структуру IRP, поступившего от Диспетчера ввода/вывода NTSTATUS ReadWrite_IRPhandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp ) { ULONG BytesTxd = 0; NTSTATUS status = STATUS_SUCCESS; //Завершение с кодом status // Задаем печать отладочных сообщений v если сборка отладочная #if DBG DbgPrint("-Example- in ReadWrite_IRPhandler."); #endif return CompleteIrp(Irp,status,BytesTxd); } // // (Файл init.cpp) // Create_File_IRPprocessing: Берет на себя обработку запросов с // кодом IRP_MJ_CREATE. // Аргументы: // Указатель на объект нашего FDO // Указатель на структуру IRP, поступившего от Диспетчера ВВ // NTSTATUS Create_File_IRPprocessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp) { PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); // Задаем печать отладочных сообщений - если сборка отладочная #if DBG DbgPrint("-Example- Create File is %ws", &(IrpStack->FileObject->FileName.Buffer)); #endif return CompleteIrp(Irp,STATUS_SUCCESS,0); // Успешное завершение } // (Файл init.cpp) // Close_File_IRPprocessing: Берет на себя обработку запросов с // кодом IRP_MJ_CLOSE. // Аргументы: // Указатель на объект нашего FDO // Указатель на структуру IRP, поступившего от Диспетчера ввода/вывода NTSTATUS Close_HandleIRPprocessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp) { #if DBG // Задаем печать отладочных сообщений - если сборка отладочная DbgPrint("-Example- In Close handler."); #endif return CompleteIrp(Irp,STATUS_SUCCESS,0);// Успешное завершение } // (Файл init.cpp) // DeviceControlRoutine: обработчик IRP_MJ_DEVICE_CONTROL запросов // Аргументы: // Указатель на объект нашего FDO // Указатель на структуру IRP, поступившего от Диспетчера ВВ // Возвращает: STATUS_XXX // #define SMALL_VERSION // В том случае, если не закомментировать верхнюю строчку v будет // выполнена компиляция версии, в которой будет обрабатываться только // один тип IOCTL запросов -- IOCTL_MAKE_SYSTEM_CRASH NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp ) { NTSTATUS status = STATUS_SUCCESS; //ULONG BytesMes=0; ULONG BytesTxd =0; // Число переданных/полученных байт (пока 0) PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp); // Получаем указатель на расширение устройства PDEVICE_EXTENSION dx =(PDEVICE_EXTENSION)fdo->DeviceExtension; //------------------------------- // Выделяем из IRP собственно значение IOCTL кода, по поводу // которого случился вызов: ULONG ControlCode =IrpStack->Parameters.DeviceIoControl.IoControlCode; ULONG method = ControlCode & 0x03; // Получаем текущее значение уровня IRQL v приоритета, // на котором выполняется поток (вообще говоря, целое число): KIRQL irql, currentIrql = KeGetCurrentIrql(); #if DBG DbgPrint("=Example= 33333333333333333"); DbgPrint("=Example= 000000000000000000000000"); DbgPrint("-Example- In DeviceControlRoutine (fdo= %X)\n",fdo); DbgPrint("-Example- DeviceIoControl: IOCTL %x.", ControlCode ); if(currentIrql==PASSIVE_LEVEL) DbgPrint("-Example- PASSIVE_LEVEL (val=%d)",currentIrql); #endif // Запрашиваем владение объектом спин-блокировки. В данном // примере не выполняется никаких критичных действий, но, // вообще говоря, этот прием может быть полезен и даже // незаменим, если в приведенном ниже коде должны будут // выполнены манипуляции, которые можно делать только // эксклюзивно. Пока потоку выделен объект спин-блокировки v // никакой другой поток не сможет войти в оператор switch: KeAcquireSpinLock(&MySpinLock,&irql); // Диспетчеризация по IOCTL кодам: switch( ControlCode) { /*Ненужная жесть! #ifndef SMALL_VERSION case IOCTL_PRINT_DEBUG_MESS: { // Только вводим сообщение и только в отладочной версии #if DBG DbgPrint("-Example- IOCTL_PRINT_DEBUG_MESS."); #endif break; } case IOCTL_CHANGE_IRQL: { #if DBG // Эксперименты по искусственному повышению // IRQL v только в отладочной версии! DbgPrint("-Example- IOCTL_CHANGE_IRQL."); KIRQL dl = DISPATCH_LEVEL, // только для распечатки (2) oldIrql, newIrql=25; // Новый уровень IRQL (например, 25) // Устанавливаем newIrql, сохраняя текущий в oldIrql: KeRaiseIrql(newIrql,&oldIrql); newIrql=KeGetCurrentIrql(); // Что реально получили? DbgPrint("-Example- DISPATCH_LEVEL value =%d",dl); DbgPrint("-Example- IRQLs are old=%d new=%d", oldIrql,newIrql); KeLowerIrql(oldIrql); // Возвращаем старое значение #endif break; } #endif // SMALL_VERSION */ case IOCTL_MAKE_SYSTEM_CRASH: { int errDetected=0; char x = (char)0xFF; #if DBG // Вообще говоря, под NT мы этого уже не увидим: DbgPrint("-Example- IOCTL_MAKE_SYSTEM_CRASH."); #endif // Вызываем системный сбой обращением по нулевому адресу __try { x = *(char*)0x0L; // ошибочная ситуация //^^^^^^^^^^^^ здесь случится сбой NT, но не Win98 } __except(EXCEPTION_EXECUTE_HANDLER) { // Перехват исключения не работает! // Эта занимательная ситуация объяснена в 10.2.6, // при рассмотрении объектов спин-блокировок. errDetected=1; }; #if DBG DbgPrint("-Example- Value of x is %X.",x); if(errDetected) DbgPrint("-Example- Except detected in Example driver."); #endif break; } case IOCTL_CATCH_WVM_XP: { ULONG InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; ULONG OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; if( OutputLength < sizeof(buf) ) { status = STATUS_INVALID_PARAMETER; break; } RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, buf, sizeof(buf)); //передали sizeof(buf) байт BytesTxd = sizeof(buf); RtlZeroMemory(buf, sizeof(buf)); Counter = 0; break; } case IOCTL_CATCH_WVM_2K: { CURRENT_INDEX = INDEX_IN_SST_IN_2K; break; } // Ошибочный запрос (код IOCTL, который не обрабатывается): default: status = STATUS_INVALID_DEVICE_REQUEST; } // Освобождение спин-блокировки KeReleaseSpinLock(&MySpinLock,irql); #if DBG DbgPrint("-Example- DeviceIoControl: %d bytes from BytesTxd written.", (int)BytesTxd); #endif return CompleteIrp(Irp,status,BytesTxd); // Завершение IRP //return CompleteIrp(Irp,status,BytesMes); } // // (Файл init.cpp) // UnloadRoutine: Выгружает драйвер, освобождая оставшиеся объекты // Вызывается системой, когда необходимо выгрузить драйвер. // Как и процедура AddDevice, регистрируется иначе чем // все остальные рабочие процедуры и не получает никаких IRP. // Arguments: указатель на объект драйвера // #pragma code_seg("PAGE") // Допускает размещение в странично организованной памяти // VOID UnloadRoutine(IN PDRIVER_OBJECT pDriverObject) { PDEVICE_OBJECT pNextDevObj; int i; ULONG CR0Reg; pNextDevObj = pDriverObject->DeviceObject; PDEVICE_EXTENSION dx =(PDEVICE_EXTENSION)pNextDevObj->DeviceExtension; // Задаем печать отладочных сообщений v если сборка отладочная #if DBG DbgPrint("-Example- In Unload Routine."); #endif //========================================================== // Нижеприведенные операции в полномасштабном WDM драйвере // следовало бы поместить в обработчике IRP_MJ_PNP запросов // с субкодом IRP_MN_REMOVE_DEVICE, но в силу простоты // драйвера, сделаем это здесь. // Проходим по всем объектам устройств, контролируемым // драйвероv __asm { cli; mov eax, cr0 mov CR0Reg,eax and eax,0xFFFEFFFF // сбросить WP bit mov cr0, eax } //восстанавливаем старый обработчик NTCALL(CURRENT_INDEX)=dx->OriginalFunc; __asm { mov eax, CR0Reg mov cr0, eax // востановить содержимое CR0 sti; } for(i=0; pNextDevObj!=NULL; i++) { // Удаляем символьную ссылку и уничтожаем FDO: UNICODE_STRING *pLinkName = & (dx->SymLinkName); // !!! сохраняем указатель: pNextDevObj = pNextDevObj->NextDevice; #if DBG DbgPrint("-Example- Deleted device (%d) : pointer to FDO = %X.",i,dx->fdo); DbgPrint("-Example- Deleted symlink = %ws.", pLinkName->Buffer); #endif IoDeleteSymbolicLink(pLinkName); IoDeleteDevice( dx->fdo); } } #pragma code_seg() // end PAGE section h: Код (Text): #ifndef _DRIVER_H_04802_BASHBD_1UIWQ1_8239_1NJKDH832_901_ #define _DRIVER_H_04802_BASHBD_1UIWQ1_8239_1NJKDH832_901_ // Выше приведены две строки (в конце файла имеется еще #endif), // которые в больших проектах запрещают повторные проходы по тексту, // который находится внутри h-файла (что весьма удобно для повышения // скорости компиляции). // (Файл Driver.h) #ifdef __cplusplus extern "C" { #endif #include "ntddk.h" #ifdef __cplusplus } #endif #include "IOCTL.h" // Определяем структуру расширения устройства. Включим в нее // указатель на FDO (для удобства последующей работы UnloadRoutine) и // имя символьной ссылки в формате UNOCODE_STRING. /* typedef struct _EXAMPLE_DEVICE_EXTENSION { PDEVICE_OBJECT fdo; UNICODE_STRING ustrSymLinkName; // L"\\DosDevices\\Example" } EXAMPLE_DEVICE_EXTENSION, *PEXAMPLE_DEVICE_EXTENSION; */ typedef NTSTATUS (*NtCreateProcessEx) //ето zwWriteVirtualMemory ( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE InheritFromProcessHandle, IN BOOLEAN InheritHandles, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL, IN HANDLE Unknown ); #define MAX_PATH 260 //структура для хранения буфера перехваченнолдрых вызовов NtWriteVirtualMemory() //Нам сказали через структуру, значит будем через структуру //Да, даже если там 1 параметр! Потом пригодиться! typedef struct _DEVICE_BUFFER { HANDLE PID; char FileName[MAX_PATH]; //Pid процесса что пишет в память } DEVICE_BUFFER, *PDEVICE_BUFFER; //структура расширения для объекта драйвера typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT fdo; UNICODE_STRING SymLinkName; // L"\\DosDevices\\Example" NtCreateProcessEx OriginalFunc; HANDLE PID; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; //typedef unsigned long DWORD; //описания SST typedef PVOID* PNTPROC; //Корче далее идёт замут!!!! typedef DWORD (ULONG); //Все кто хочет понять это typedef DWORD* PDWORD; //то читайте Свена Шрайбера typedef unsigned char (BYTE); //"Недокументированные возможности WINNT" typedef BYTE* PBYTE; //стр 284(листинг 5.1)!!! //P.S: Это не прикол!!!! typedef struct _SYSTEM_SERVICE_TABLE { PNTPROC ServiceTable; PDWORD CounterTable; ULONG ServiceLimit; PBYTE ArgumentTable; } SYSTEM_SERVICE_TABLE , * PSYSTEM_SERVICE_TABLE , * * PPSYSTEM_SERVICE_TABLE ; typedef struct _SERVICE_DESCRIPTOR_TABLE { SYSTEM_SERVICE_TABLE ntoskrnl; SYSTEM_SERVICE_TABLE win32k; SYSTEM_SERVICE_TABLE unused1; SYSTEM_SERVICE_TABLE unused2; } SERVICE_DESCRIPTOR_TABLE , //* KeServiceDescriptorTable, * PSERVICE_DESCRIPTOR_TABLE, * * PPSERVICE_DESCRIPTOR_TABLE ; //Всё замут кончился!!!!!! extern "C" extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable; //Так этот поклонника Руссиновича(Шрайбер) извлекает данные из SDT #define NTCALL(_function) KeServiceDescriptorTable->ntoskrnl.ServiceTable[_function] extern PUSHORT NtBuildNumber; //Версия ядра - он очень любил писать про номер сборки своего ядра(достал он с ним) #endif h: Код (Text): // Внимание! Текст приведенный ниже должен войти в файл Ioctl.h, // который будет необходим для компиляции тестового приложения. // (Разумеется, за исключением последней строки с "#endif".) #ifndef __IOCTL__ #define __IOCTL__ #define IOCTL_PRINT_DEBUG_MESS CTL_CODE( \ FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_CHANGE_IRQL CTL_CODE(\ FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_MAKE_SYSTEM_CRASH CTL_CODE( \ FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_TOUCH_PORT_378H CTL_CODE( \ FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_SEND_BYTE_TO_USER CTL_CODE( \ FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_CATCH_WVM_XP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_CATCH_WVM_2K CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, FILE_ANY_ACCESS) #endif // Вариант : //#define IOCTL_SEND_BYTE_TO_USER CTL_CODE( \ // FILE_DEVICE_UNKNOWN, 0x805, METHOD_NEITHER, FILE_ANY_ACCESS)
Товарищи меня тоже очень интересует этот вопрос. может кто то поможет. Предыдущее предлжение тоже не помогло.
Т.е мне нужно в начале нового обработчика NtCreateSEction вставить __try{ ProbeForRead( ObjectAttributes->ObjectName , ObjectAttributes->ObjectName->Length, 1 ); }__except{}