• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 2, 文章 - 2, 評論 - 0, 引用 - 0
            數據加載中……

            VC中加載驅動程序

            從KProcCheck的代碼里提取出來的,不用安裝驅動程序,自己的程序里要用的時候用HANDLE openDriver(void)加載驅動,用完了void uninstallDriver(void)卸載。使用時還需自己修改,代碼不難,看下就明白了。


            代碼如下:

            //HANDLE openDriver(void)打開驅動建立的符號鏈接的句柄
            //void uninstallDriver(void)卸載驅動,要把openDriver打開的句柄關閉才可以成功卸載

            #include <windows.h>

            #define DRV_NAME      "DLPORTIO"http://驅動名
            #define DRV_FILENAME     "DLPORTIO.sys"http://驅動文件

            #define STATUS_SUCCESS     ((NTSTATUS)0x00000000L)


            typedef LONG NTSTATUS;

            typedef struct _STRING {
              USHORT  Length;
              USHORT  MaximumLength;
              PCHAR  Buffer;
            } ANSI_STRING, *PANSI_STRING;

            typedef struct _UNICODE_STRING {
              USHORT  Length;
              USHORT  MaximumLength;
              PWSTR  Buffer;
            } UNICODE_STRING, *PUNICODE_STRING;

            //*********************************************************************************************
            // Assign loaddriver priviledge to our process, so we can load our support driver.
            //
            //*********************************************************************************************

            BOOL getLoadDriverPriv()
            {
             HANDLE hToken;

             if(OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
             {
              LUID huid;
              if(LookupPrivilegeValue(NULL, "SeLoadDriverPrivilege", &huid))
              {
               LUID_AND_ATTRIBUTES priv;
               priv.Attributes = SE_PRIVILEGE_ENABLED;
               priv.Luid = huid;

               TOKEN_PRIVILEGES tp;
               tp.PrivilegeCount = 1;
               tp.Privileges[0] = priv;

               if(AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL))
               {
                return TRUE;
               }
              }
             }
             return FALSE;
            }


            //*********************************************************************************************
            // Sets up the necessary registry settings to load the support driver
            //
            //*********************************************************************************************

            BOOL setupRegistry()
            {
             HKEY hkey;
             if(RegCreateKey(HKEY_LOCAL_MACHINE, "System\CurrentControlSet\Services\"DRV_NAME, &hkey) != ERROR_SUCCESS)
              return FALSE;

             DWORD val;
             val = 1;
             if(RegSetValueEx(hkey, "Type", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)
              return FALSE;

             if(RegSetValueEx(hkey, "ErrorControl", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)
              return FALSE;
             
             val = 3;
             if(RegSetValueEx(hkey, "Start", 0, REG_DWORD, (PBYTE)&val, sizeof(val)) != ERROR_SUCCESS)
              return FALSE;

             char *imgName = "System32\DRIVERS\"DRV_FILENAME;
             
             if(RegSetValueEx(hkey, "ImagePath", 0, REG_EXPAND_SZ, (PBYTE)imgName, strlen(imgName)) != ERROR_SUCCESS)
              return FALSE;

             return TRUE;
            }


            //*********************************************************************************************
            // Actual code to load our driver into memory
            //
            //*********************************************************************************************

            BOOL loadDriver()
            {
             // call ntdll APIs
             HMODULE hntdll;

             NTSTATUS (WINAPI *_RtlAnsiStringToUnicodeString)(PUNICODE_STRING  DestinationString,IN PANSI_STRING  SourceString,IN

            BOOLEAN);

             VOID (WINAPI *_RtlInitAnsiString)
              (IN OUT PANSI_STRING  DestinationString,
               IN PCHAR  SourceString);

             NTSTATUS (WINAPI * _ZwLoadDriver)
              (IN PUNICODE_STRING DriverServiceName);

             NTSTATUS (WINAPI * _ZwUnloadDriver)
              (IN PUNICODE_STRING DriverServiceName);

             VOID (WINAPI * _RtlFreeUnicodeString)
              (IN PUNICODE_STRING  UnicodeString);


             hntdll = GetModuleHandle("ntdll.dll");
              
             *(FARPROC *)&_ZwLoadDriver = GetProcAddress(hntdll, "NtLoadDriver");

             *(FARPROC *)&_ZwUnloadDriver = GetProcAddress(hntdll, "NtUnloadDriver");
               
             *(FARPROC *)&_RtlAnsiStringToUnicodeString =
               GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString");

             *(FARPROC *)&_RtlInitAnsiString =
               GetProcAddress(hntdll, "RtlInitAnsiString");

             *(FARPROC *)&_RtlFreeUnicodeString =
               GetProcAddress(hntdll, "RtlFreeUnicodeString");

             if(_ZwLoadDriver && _ZwUnloadDriver && _RtlAnsiStringToUnicodeString &&
                _RtlInitAnsiString && _RtlFreeUnicodeString)
             {
              ANSI_STRING aStr;
             
              _RtlInitAnsiString(&aStr,
              "\Registry\Machine\System\CurrentControlSet\Services\"DRV_NAME);
                 
              UNICODE_STRING uStr;

              if(_RtlAnsiStringToUnicodeString(&uStr, &aStr, TRUE) != STATUS_SUCCESS)
               return FALSE;
              else
              {
               if(_ZwLoadDriver(&uStr) == STATUS_SUCCESS)
               {
                _RtlFreeUnicodeString(&uStr);
                return TRUE;
               }
               _RtlFreeUnicodeString(&uStr);
              }
             }

             return FALSE;
            }


            //*********************************************************************************************
            // Actual code to remove our driver from memory
            //
            //*********************************************************************************************

            BOOL unloadDriver()
            {
             // call ntdll APIs
             HMODULE hntdll;
             NTSTATUS (WINAPI * _RtlAnsiStringToUnicodeString)
              (PUNICODE_STRING  DestinationString,
               IN PANSI_STRING  SourceString,
               IN BOOLEAN);

             VOID (WINAPI *_RtlInitAnsiString)
              (IN OUT PANSI_STRING  DestinationString,
               IN PCHAR  SourceString);

             NTSTATUS (WINAPI * _ZwLoadDriver)
              (IN PUNICODE_STRING DriverServiceName);

             NTSTATUS (WINAPI * _ZwUnloadDriver)
              (IN PUNICODE_STRING DriverServiceName);

             VOID (WINAPI * _RtlFreeUnicodeString)
              (IN PUNICODE_STRING  UnicodeString);


             hntdll = GetModuleHandle("ntdll.dll");
              
             *(FARPROC *)&_ZwLoadDriver = GetProcAddress(hntdll, "NtLoadDriver");

             *(FARPROC *)&_ZwUnloadDriver = GetProcAddress(hntdll, "NtUnloadDriver");
               
             *(FARPROC *)&_RtlAnsiStringToUnicodeString =
               GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString");

             *(FARPROC *)&_RtlInitAnsiString =
               GetProcAddress(hntdll, "RtlInitAnsiString");

             *(FARPROC *)&_RtlFreeUnicodeString =
               GetProcAddress(hntdll, "RtlFreeUnicodeString");

             if(_ZwLoadDriver && _ZwUnloadDriver && _RtlAnsiStringToUnicodeString &&
                _RtlInitAnsiString && _RtlFreeUnicodeString)
             {
              ANSI_STRING aStr;
             
              _RtlInitAnsiString(&aStr,
              "\Registry\Machine\System\CurrentControlSet\Services\"DRV_NAME);
                 
              UNICODE_STRING uStr;

              if(_RtlAnsiStringToUnicodeString(&uStr, &aStr, TRUE) != STATUS_SUCCESS)
               return FALSE;
              else
              {
               if(_ZwUnloadDriver(&uStr) == STATUS_SUCCESS)
               {
                _RtlFreeUnicodeString(&uStr);
                return TRUE;
               }
               _RtlFreeUnicodeString(&uStr);
              }
             }

             return FALSE;
            }


            //*********************************************************************************************
            // Removes our driver file and registry settings
            //
            //*********************************************************************************************

            void cleanupDriver(void)
            {
             char sysDir[MAX_PATH + 1];
             GetSystemDirectory(sysDir, MAX_PATH);
             strncat(sysDir, "\drivers\"DRV_FILENAME, MAX_PATH);
             DeleteFile(sysDir);

             RegDeleteKey(HKEY_LOCAL_MACHINE, "System\CurrentControlSet\Services\"DRV_NAME"\Enum");
             RegDeleteKey(HKEY_LOCAL_MACHINE, "System\CurrentControlSet\Services\"DRV_NAME);
            }


            //*********************************************************************************************
            // Attempts to get a handle to our kernel driver.  If fails, try to install the driver.
            //
            //*********************************************************************************************

            HANDLE openDriver(void)
            {
             HANDLE hDevice;
             //CreateFile打開驅動建立的符號鏈接,得根據驅動中建立的名字更改
             hDevice = CreateFile("\\.\"DRV_NAME, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
                      NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

             if(hDevice == INVALID_HANDLE_VALUE)
             { 
              char drvFullPath[MAX_PATH+1];
              char *filePart;

              ZeroMemory(drvFullPath, MAX_PATH); 
              GetFullPathName(DRV_FILENAME, MAX_PATH, drvFullPath, &filePart);
             
              //printf("%s ", drvFullPath);
              HANDLE hFile = CreateFile(drvFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL, 0);
              if(hFile == INVALID_HANDLE_VALUE)
              {
               //printf("Cannot find required driver file %s ", drvFullPath);
               AfxMessageBox("Cannot find required driver file");
               return INVALID_HANDLE_VALUE;
              }
              else
              {
               CloseHandle(hFile);

               char sysDir[MAX_PATH + 1];
               GetSystemDirectory(sysDir, MAX_PATH);
               strncat(sysDir, "\drivers\"DRV_FILENAME, MAX_PATH);
               CopyFile(drvFullPath, sysDir, TRUE);

               if(!getLoadDriverPriv())
               {
                //printf("Error getting load driver privilege! ");
                AfxMessageBox("Error getting load driver privilege! ");
               }
               else
               {
                if(!setupRegistry())
                {
                 //printf("Error setting driver registry keys! Make sure you are running this as

            Administrator. ");
                 AfxMessageBox("Error setting driver registry keys! Make sure you are running this as

            Administrator. ");
                }
                else
                {
                 loadDriver();
                 hDevice = CreateFile("\\.\"DRV_NAME, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ

            | FILE_SHARE_WRITE,
                      NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
                 if(hDevice == INVALID_HANDLE_VALUE)
                 {
                  //printf("Error loading kernel support driver! Make sure you are running

            this as Administrator. ");
                  AfxMessageBox("Error loading kernel support driver! Make sure you are

            running this as Administrator. ");
                 }
                 else
                 {
                  AfxMessageBox("loading kernel support driver success");
                 }
                }
               }
               cleanupDriver();
              }
             }
             
             return hDevice;
            }


            //*********************************************************************************************
            // Remove our kernel driver from memory
            //
            //*********************************************************************************************

            void uninstallDriver(void)
            {
             char drvFullPath[MAX_PATH+1];
             char *filePart;

             ZeroMemory(drvFullPath, MAX_PATH); 
             GetFullPathName(DRV_FILENAME, MAX_PATH, drvFullPath, &filePart);

             HANDLE hFile = CreateFile(drvFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL, 0);
             if(hFile == INVALID_HANDLE_VALUE)
             {
              //printf("Cannot find required driver file %s ", drvFullPath);
              AfxMessageBox("Cannot find required driver file ");
              return;
             }
             else
             {
              CloseHandle(hFile);

              char sysDir[MAX_PATH + 1];
              GetSystemDirectory(sysDir, MAX_PATH);
              strncat(sysDir, "\drivers\"DRV_FILENAME, MAX_PATH);
              CopyFile(drvFullPath, sysDir, TRUE);

              if(!getLoadDriverPriv())
              {
               //printf("Error getting load driver privilege! ");
               AfxMessageBox("Error getting load driver privilege! ");
              }
              else
              {
               if(!setupRegistry())
               {
                //printf("Error setting driver registry keys! Make sure you are running this as

            Administrator. ");
                AfxMessageBox("Error setting driver registry keys! Make sure you are running this as

            Administrator. ");
               }
               else
               {
                if(unloadDriver())
                 //printf("Support driver successfully unloaded. ");
                 AfxMessageBox("Support driver successfully unloaded. ");
                else
                 //printf("Unload support driver failed.  It is probably not loaded. ");
                 AfxMessageBox("Unload support driver failed.  It is probably not loaded. ");
               }
              }
              cleanupDriver();
             }
            }



            posted on 2008-09-20 17:38 vfdff 閱讀(2495) 評論(0)  編輯 收藏 引用 所屬分類: technic

            国产精品久久久久一区二区三区| 欧美激情精品久久久久| 久久频这里精品99香蕉久| 久久笫一福利免费导航 | 久久成人国产精品免费软件| 国产一区二区久久久| 国内精品久久久久影院日本| 99久久精品免费看国产一区二区三区 | 国产精品伦理久久久久久| 亚洲а∨天堂久久精品9966| 亚洲精品无码久久千人斩| 久久久久久a亚洲欧洲aⅴ| 久久受www免费人成_看片中文| 九九99精品久久久久久| 综合久久一区二区三区 | A级毛片无码久久精品免费| 一本久久久久久久| 无码人妻久久一区二区三区免费| 久久综合综合久久97色| 亚洲午夜久久久久久久久久| 久久男人AV资源网站| 久久久久夜夜夜精品国产| 亚洲国产精品无码久久久蜜芽 | 久久99中文字幕久久| 午夜精品久久久久久毛片| 久久婷婷色综合一区二区| 97久久精品午夜一区二区| 一本色综合网久久| 奇米影视7777久久精品人人爽 | 久久午夜无码鲁丝片秋霞 | 久久影院午夜理论片无码| 久久青草国产精品一区| 久久国产色AV免费观看| 久久久精品人妻一区二区三区四| 久久无码高潮喷水| 亚洲人成电影网站久久| 久久天天躁狠狠躁夜夜2020老熟妇| 狠狠人妻久久久久久综合蜜桃| 94久久国产乱子伦精品免费| 久久综合中文字幕| 精品久久久久久无码中文野结衣|