亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? load.c

?? 驅動層Hook系統內核調用的
?? C
字號:
/*
 driver loader is used to install the driver via service manager 
 it also sends some commands to driver
 usage is simple: load driver_name driver_display_name path
 you can use loadhook.bat 

 second thread was added to receive events from driver 
 it uses asynchronous IO to manage this
 see description in the main driver file for more
*/

#include <windows.h>
#include <stdio.h>
#include <ddk/ntddk.h>
#include "../drvcomm.h"


int work=0;                                     //indicator of application status
HANDLE notify_event;                            //sync event between notify thread and main thread
int notify_type;                                //type of driver notification
DWORD notify_data;                              //driver notification data
HANDLE notify_dev;                              //notify thread device file

/*
 second thread manages notifications from driver
 we do not take any action if something in this thread failed
 however, for the functionality of our program this thread is important 
 so in real world program this should be handled too
 also synchronization is missing in this example
*/

DWORD WINAPI notify_thread(LPVOID args)
{
  printf("Notify thread runs\n");
  HANDLE notify_dev=CreateFile(args,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,
                               NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
  if (notify_dev==INVALID_HANDLE_VALUE) notify_dev=0;
  if (notify_dev)
  {
    OVERLAPPED overlapped;
    overlapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

    if (overlapped.hEvent)
    {
      while (work)
      {
        DRVCOMM_REQUEST_BUFFER buf_req;
        DRVCOMM_RESPONSE_BUFFER buf_res;
        memset(&buf_req,0,sizeof(buf_req));
        memset(&buf_res,0,sizeof(buf_res));

        DWORD bytes;
        int ret=DeviceIoControl(notify_dev,IOCTL_NOTIFY,NULL,0,&buf_res,sizeof(buf_res),&bytes,&overlapped);

        int err=ret?0:GetLastError();

        if (err==ERROR_IO_PENDING)
        {
          if (GetOverlappedResult(notify_dev,&overlapped,&bytes,TRUE)) err=0;
          else err=GetLastError();
        }

        if (err)
        {
          if (err==ERROR_OPERATION_ABORTED) printf("Notify thread received exit signal\n");
          else printf("Notify thread error: unexpected DeviceIoControl error %d\n",err);
          break;
        }

        if (!bytes || !buf_res.status)
        {
          printf("Notify thread communication error: bytes=%d; buf_res.status=0x%.8X\n",bytes,buf_res.status);
          break;
        }

        /*
         we've received notification from driver
        */

        switch (buf_res.type)
        {
          case RESPONSE_PROCESS_CHECK:
            printf("Notify thread: RESPONSE_PROCESS_CHECK received, you should make a decision:\n");
            notify_type=RESPONSE_PROCESS_CHECK;
            notify_data=buf_res.parameters.process_check.pid;

            printf("permit 0x%.8X access for process pid=%d to process pid=%d?\n",
                   buf_res.parameters.process_check.access,buf_res.parameters.process_check.caller_pid,notify_data);

            PulseEvent(notify_event);
            WaitForSingleObject(notify_event,INFINITE);
            printf("Notify thread wait done, answer = %s\n",notify_data?"deny":"permit");

            buf_req.parameters.process_check.permit=notify_data;
            ret=DeviceIoControl(notify_dev,IOCTL_NOTIFY_PROCESS_CHECK,&buf_req,sizeof(buf_req),NULL,0,&bytes,&overlapped);

            if (!ret && (GetLastError()==ERROR_IO_PENDING)) GetOverlappedResult(notify_dev,&overlapped,&bytes,TRUE);
            break;

          default:
            printf("Notify thread error: unknown response buffer type\n");
        }
      }
      CloseHandle(overlapped.hEvent);
    } else printf("Notify thread error: unable to create event\n");

    CloseHandle(notify_dev);
  } else printf("Notify thread error: unable to connect device\n");

  printf("Notify thread terminates\n");
  ExitThread(0);
}



int main(int argc,char **argv)
{
  /*
   this version uses ZwQueryInformationThread in kernel driver to determine
   process that owns specific thread, unfortunately ntoskrnl.exe exports 
   ZwQueryInformationThread in XP and higher, but the implementation is also 
   available in W2k, so we will do a little hack here and from user mode 
   ntdll.dll we retrieve an index to SDT and send it to kernel driver to call
   ZwQueryInformationThread using this index
   we could hardcode the index for W2k but this way it is more elegant as we 
   don't need to care about service pack differences
   this is quite simple solution but it works only if this function is not 
   hooked in ntdll.dll, if the function is hooked (and index is rewritten)
   this hack fails, however, in this case we should load and map ntdll.dll
   from disk to get raw unhooked image and find our function address in export 
   table and retrieve the index from the image then, this is not implemented 
   in this version, we assume clear (not hooked) environment
  */
  ULONG SDT_index_ZwQIT=0;
  HMODULE ntdll=GetModuleHandle("ntdll.dll");
  PVOID ZwQIT=GetProcAddress(ntdll,"ZwQueryInformationThread");
  if (ZwQIT) SDT_index_ZwQIT=*((PULONG)((UCHAR *)ZwQIT+1));

  printf("SDT_index_ZwQIT = 0x%.8X\n",SDT_index_ZwQIT);
  if (SDT_index_ZwQIT>0x0200) SDT_index_ZwQIT=0;
  if (!SDT_index_ZwQIT)
  {
    printf("error: unable to retrieve valid SDT index for ZwQueryInformationThread\n");
    return 0;
  }

  printf("Opening service manager ...\n");
  HANDLE scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE);
  
  if(scm)
  {
    printf("Creating service ...\n");

    HANDLE svc=CreateService(scm,argv[1],argv[2],SERVICE_START | DELETE | SERVICE_STOP,SERVICE_KERNEL_DRIVER,
                             SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,argv[3],NULL,NULL,NULL,NULL,NULL);

    if(!svc)
    {
      printf("Creating failed, trying to open service ...\n");
      svc=OpenService(scm,argv[1],SERVICE_START | DELETE | SERVICE_STOP);
    }

    if(svc)
    {
      printf("Starting service\n");

      StartService(svc,0,NULL);

      printf("Creating communication device ...\n");

      /*
       for MSTS we need to use Global namespace to access our device
      */
      char dev_name[256];
      if ((GetVersion()&0xFF)>=5) sprintf(dev_name,"\\\\.\\Global\\%s\0",argv[1]);
      else sprintf(dev_name,"\\\\.\\%s\0",argv[1]);

      HANDLE dev=CreateFile(dev_name,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);

      if (dev==INVALID_HANDLE_VALUE) dev=0;
      if (dev)
      {
        printf("Starting notify thread\n");
        work=1;
        DWORD tid;
        HANDLE thread=CreateThread(NULL,0,notify_thread,dev_name,0,&tid);
        if (thread==INVALID_HANDLE_VALUE) thread=0;
        notify_event=CreateEvent(NULL,TRUE,FALSE,NULL);

        if (thread && notify_event)
        {
          CloseHandle(thread);

          printf("Press Enter to send IOCTL_HOOK_START\n");
          getchar();

          DRVCOMM_REQUEST_BUFFER buf_req;
          DRVCOMM_RESPONSE_BUFFER buf_res;
          DWORD bytes=0,ret;

          buf_req.parameters.init.SDT_index_ZwQueryInformationThread=SDT_index_ZwQIT;

          /*
           send command to our driver, no input buffer is used here
           output buffer contains status value only
          */
          memset(&buf_res,0,sizeof(buf_res));
          ret=DeviceIoControl(dev,IOCTL_HOOK_START,&buf_req,sizeof(buf_req),&buf_res,sizeof(buf_res),&bytes,NULL);
          printf("DeviceIoControl returned code 0x%.8X, status 0x%.8X and %d bytes\n",ret,buf_res.status,bytes);

          if (buf_res.status)
          {
            /*
             this is a loop for driver rules managment
            */
            printf("\nenter commands to protect/disable protection of processes\n"
                   "to enable protection for process write 'e PID'\n"
                   "to disable protection for process write 'd PID'\n"
                   "to answer process check write 'p 0/1' - '0' for deny and '1' for permit\n"
                   "current process id = %d\n"
                   "write 'x 0' for end\n",GetCurrentProcessId());

            while (work)
            {
              bytes=0;
              char ch_type;
              int obj_id=0;
              scanf("%c %d",&ch_type,&obj_id);
              getchar();

              int enable;
              ULONG code;

              switch (ch_type)
              {
                case 'd':
                case 'e':
                  enable=ch_type=='e';
                  code=IOCTL_PROTECT_PROCESS;
                  buf_req.parameters.protect_process.pid=obj_id;
                  buf_req.parameters.protect_process.enable=enable;
                  ret=DeviceIoControl(dev,code,&buf_req,sizeof(buf_req),&buf_res,sizeof(buf_res),&bytes,NULL);
                  printf("DeviceIoControl returned code 0x%.8X, status 0x%.8X and %d bytes\n",ret,buf_res.status,bytes);
                  break;

                case 'p':
                  notify_data=!obj_id;          //we set protect TRUE or FALSE -> protect = !permit
                  PulseEvent(notify_event);
                  break;

                case 'x':
                  work=0;
                  break;

                default:
                  printf("unknown command type %c\n",ch_type);
              }
            }

            bytes=0;
            printf("Press Enter to send IOCTL_HOOK_STOP\n");
            getchar();

            ret=DeviceIoControl(dev,IOCTL_HOOK_STOP,NULL,0,&buf_res,sizeof(buf_res),&bytes,NULL);
            printf("DeviceIoControl returned code 0x%.8X, status 0x%.8X and %d bytes\n",ret,buf_res.status,bytes);

            //cancel possible waiting
            PulseEvent(notify_event);
          }

          printf("Press Enter to send close device handle\n");
          getchar();
          CloseHandle(dev);
        } else printf("error: unable to create notify thread\n");

        if (notify_event) CloseHandle(notify_event);

      } else printf("error: unable to create communication device\n");

      printf("Press Enter to stop and delete service \n");
      getchar();

      SERVICE_STATUS status;
      ControlService(svc,SERVICE_CONTROL_STOP,&status);

      DeleteService(svc);
      CloseServiceHandle(svc);
    } else printf("error: unable to create/open service\n");

    CloseServiceHandle(scm);
  } else printf("error: unable to open manager\n");
  
  return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区三| 国产亚洲短视频| 成人h动漫精品| 亚洲成人激情综合网| 国产精品每日更新| 日韩欧美一区二区免费| 在线一区二区视频| 99久久精品一区| 国产乱码精品一区二区三| 日本中文字幕不卡| 一级日本不卡的影视| 国产日韩精品一区二区三区| 欧美一区二区三区小说| 日本韩国一区二区三区视频| 国产91精品精华液一区二区三区| 亚洲va韩国va欧美va| 亚洲色图欧美在线| 国产精品久久久久久福利一牛影视| 精品国产区一区| 91精品国产一区二区三区香蕉| 色婷婷久久久久swag精品| 成人黄色在线网站| 国产成人在线免费观看| 激情文学综合网| 日本麻豆一区二区三区视频| 午夜亚洲国产au精品一区二区| 亚洲女爱视频在线| 国产精品久久久久一区二区三区 | 欧美另类变人与禽xxxxx| 99久久99久久精品免费观看| 国产高清成人在线| 国产精品亚洲成人| 国产精品资源在线| 东方欧美亚洲色图在线| 国产精品一区二区三区乱码| 国产毛片精品国产一区二区三区| 久久精品国产亚洲aⅴ| 久久成人免费日本黄色| 久久av资源站| 精品夜夜嗨av一区二区三区| 午夜av电影一区| 天天综合日日夜夜精品| 日韩电影免费在线| 免费高清不卡av| 懂色av中文字幕一区二区三区| 国产一区二区视频在线播放| 国产aⅴ综合色| av在线不卡免费看| 91美女视频网站| 欧美日韩中文字幕一区二区| 欧美日本高清视频在线观看| 欧美精品免费视频| 日韩精品中文字幕在线不卡尤物| 久久综合九色综合欧美98| 久久夜色精品一区| 国产精品久久99| 亚洲免费av在线| 奇米精品一区二区三区四区| 久久er99热精品一区二区| 国产成都精品91一区二区三| 91在线观看一区二区| 欧美在线你懂的| 91精品国产一区二区三区| 久久久久久电影| 国产精品国产三级国产| 亚洲国产视频直播| 男女性色大片免费观看一区二区| 国产精品自拍av| 色94色欧美sute亚洲线路一ni | 一区二区国产盗摄色噜噜| 偷拍一区二区三区| 国产精品白丝av| 色琪琪一区二区三区亚洲区| 日韩一区二区三区四区| 亚洲国产激情av| 午夜激情一区二区| 国产99一区视频免费| 欧美日韩高清影院| 国产欧美视频在线观看| 一区二区三区免费在线观看| 久久99久久精品欧美| 91蜜桃免费观看视频| 日韩欧美高清在线| 亚洲精品乱码久久久久久日本蜜臀| 日韩精品久久久久久| 成人av免费在线播放| 91精品国产品国语在线不卡| 免费精品99久久国产综合精品| 国产一区二区0| 欧美日韩美女一区二区| 中文字幕av资源一区| 偷拍亚洲欧洲综合| 91在线免费视频观看| 欧美不卡视频一区| 亚洲一区免费视频| 高清不卡在线观看| 日韩一区二区免费在线电影| 1024亚洲合集| 国产精品一区二区视频| 欧美一区二区在线视频| 一区二区在线观看av| 国产成人精品三级| 日韩一区二区在线观看视频| 亚洲黄色尤物视频| 成人午夜激情视频| 久久久午夜精品| 精品中文字幕一区二区小辣椒| 91成人免费网站| 18成人在线观看| 成人黄色片在线观看| 久久综合av免费| 蜜臀久久久99精品久久久久久| 欧美探花视频资源| 亚洲特级片在线| 成人av在线一区二区三区| 精品裸体舞一区二区三区| 肉肉av福利一精品导航| 欧美日韩综合色| 亚洲国产中文字幕在线视频综合 | 成人激情免费电影网址| 久久免费视频一区| 久久99国产精品成人| 欧美成人一区二区| 麻豆国产欧美日韩综合精品二区| 欧美精品一级二级| 日日摸夜夜添夜夜添精品视频| 在线观看亚洲精品视频| 亚洲黄色在线视频| 欧美主播一区二区三区| 亚洲精品国产一区二区三区四区在线| 成人高清免费观看| 最新国产精品久久精品| 99精品视频一区| 亚洲欧美日韩一区二区三区在线观看| 成人黄色av电影| 自拍偷拍国产精品| 91亚洲精品久久久蜜桃网站| 自拍偷自拍亚洲精品播放| 91久久免费观看| 亚洲国产日韩精品| 在线不卡的av| 久久99精品国产91久久来源| 久久久久久免费网| 不卡电影一区二区三区| 亚洲另类一区二区| 欧美日韩精品一区视频| 男人的天堂亚洲一区| 精品国产一区a| 成人福利在线看| 亚洲影院在线观看| 日韩一卡二卡三卡四卡| 久久99国产精品久久99| 国产欧美日韩综合精品一区二区| 成人黄色av网站在线| 亚洲狼人国产精品| 在线成人av网站| 国产成人精品免费看| 亚洲丝袜制服诱惑| 欧美日韩一二三区| 精品一区精品二区高清| 国产欧美日韩亚州综合| 在线观看精品一区| 另类小说欧美激情| 国产精品久久久久久福利一牛影视| 在线观看一区不卡| 国模少妇一区二区三区| 亚洲人成在线观看一区二区| 91精品国产综合久久久久久久久久| 国内精品不卡在线| 天天av天天翘天天综合网色鬼国产| 欧美不卡123| 91成人看片片| 国产麻豆精品视频| 亚洲激情网站免费观看| 欧美成人免费网站| 91看片淫黄大片一级| 日韩电影网1区2区| 中文字幕制服丝袜一区二区三区| 在线观看一区二区视频| 国产精品亚洲第一| 一区二区三区欧美日| 久久亚洲精华国产精华液| 色乱码一区二区三区88| 精品系列免费在线观看| 亚洲激情五月婷婷| 久久青草国产手机看片福利盒子| 欧美色窝79yyyycom| 国产福利一区二区| 日韩专区中文字幕一区二区| 国产精品女同一区二区三区| 制服丝袜亚洲色图| 91麻豆免费看片| 国产99久久久国产精品| 日韩国产一二三区| 亚洲综合图片区| 中文字幕日韩一区| 久久久久久久久久久久电影| 欧美日本精品一区二区三区| 色综合咪咪久久| 不卡电影一区二区三区|