#ifndef __DRVCOMM_H__
#define __DRVCOMM_H__

//device names
#define DEVICE_NAME             L"\\Device\\hook8"
#define DOS_DEVICE_NAME         L"\\DosDevices\\hook8"

//types of response buffer
#define RESPONSE_NOTIFY_PROCESS_CHECK           0x00000001
#define RESPONSE_NOTIFY_LOAD_DRIVER_CHECK       0x00000002

//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)

//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;

  } 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;
  } parameters;
} DRVCOMM_RESPONSE_BUFFER,*PDRVCOMM_RESPONSE_BUFFER;

#endif
