#ifndef __DRVCOMM_H__ #define __DRVCOMM_H__ //device names #define DEVICE_NAME L"\\Device\\hook9" #define DOS_DEVICE_NAME L"\\DosDevices\\hook9" //types of response buffer #define RESPONSE_NOTIFY_PROCESS_CHECK 0x00000001 #define RESPONSE_NOTIFY_LOAD_DRIVER_CHECK 0x00000002 #define RESPONSE_NOTIFY_PHYSICAL_MEMORY_CHECK 0x00000003 //IO control codes //HOOK_START initiates hooks #define IOCTL_HOOK_START CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) //HOOK_STOP unhooks hooked functions #define IOCTL_HOOK_STOP CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) //PROTECT_PROCESS adds/removes Process protection #define IOCTL_PROTECT_PROCESS CTL_CODE(FILE_DEVICE_UNKNOWN,0x880,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) //NOTIFY waits for driver notification #define IOCTL_NOTIFY CTL_CODE(FILE_DEVICE_UNKNOWN,0x900,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) //IOCTL_NOTIFY_PROCESS_CHECK answers IOCTL_NOTIFY type RESPONSE_NOTIFY_PROCESS_CHECK #define IOCTL_NOTIFY_PROCESS_CHECK CTL_CODE(FILE_DEVICE_UNKNOWN,0x980,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) //IOCTL_NOTIFY_LOAD_DRIVER_CHECK answers IOCTL_NOTIFY type RESPONSE_NOTIFY_LOAD_DRIVER_CHECK #define IOCTL_NOTIFY_LOAD_DRIVER_CHECK CTL_CODE(FILE_DEVICE_UNKNOWN,0x981,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) //IOCTL_NOTIFY_PHYSICAL_MEMORY_CHECK answers IOCTL_NOTIFY type RESPONSE_NOTIFY_PHYSICAL_MEMORY_CHECK #define IOCTL_NOTIFY_PHYSICAL_MEMORY_CHECK CTL_CODE(FILE_DEVICE_UNKNOWN,0x982,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA) //driver/app communication buffers typedef struct DRVCOMM_REQUEST_BUFFER { union { struct { ULONG SDT_index_ZwQueryInformationThread; //SDT index of ZwQueryInformationThread } init; struct { ULONG pid; //pid of process to protect/disable protection for int enable; //protect on true, disable protection otherwise } protect_process; struct { int permit; //true to permit the operation, false not to permit the operation } process_check,load_driver_check,physical_memory_check; } parameters; } DRVCOMM_REQUEST_BUFFER,*PDRVCOMM_REQUEST_BUFFER; typedef struct DRVCOMM_RESPONSE_BUFFER { ULONG status; //status of requested operation, should be 1 on success ULONG type; //type of response buffer union { struct { ULONG caller_pid; //pid of process that requests access ULONG pid; //pid of protected process ULONG access; //required access } process_check; struct { ULONG caller_pid; //pid of process that requests access wchar_t regpath[512]; //registry path in system format } load_driver_check; struct { ULONG caller_pid; //pid of process that requests access ULONG access; //required access } physical_memory_check; } parameters; } DRVCOMM_RESPONSE_BUFFER,*PDRVCOMM_RESPONSE_BUFFER; #endif