• <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
            數據加載中……

            2020年11月21日

            C++中的mutable和volatile

            參考 https://blog.csdn.net/FX677588/article/details/74615658 1、在C++中,mutable是為了突破const的限制而設置的。被mutable修飾的變量,將永遠處于可變的狀態,即使在一個const函數中,甚至結構體變量或者類對象為const,其mutable成員也可以被修改,對業務邏輯的約束 2、volatile是一個類型修飾符。volatile修飾的數據,編譯器不可對其進行執行期寄存器于寄存器的優化。這種特性,是為了滿足多線程同步、中斷、硬件編程等特殊需要。遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優化,從而可以提供對特殊地址的直接訪問,對編譯器的優化約束

            posted @ 2020-11-21 11:25 vfdff 閱讀(461) | 評論 (0)編輯 收藏

            2008年9月20日

            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 @ 2008-09-20 17:38 vfdff 閱讀(2495) | 評論 (0)編輯 收藏

            国产精品久久自在自线观看| 一本色综合久久| 午夜精品久久久久久99热| 久久精品国产男包| 亚洲国产精品久久久久网站| 久久99国产精一区二区三区| 久久国产成人精品国产成人亚洲| 99久久这里只精品国产免费| 久久天天躁狠狠躁夜夜躁2O2O| 人人狠狠综合久久亚洲婷婷 | 久久综合一区二区无码| 精品免费久久久久久久| 久久国产免费| 久久国产热精品波多野结衣AV| 久久99精品久久久久久秒播 | 99久久人人爽亚洲精品美女| 久久久久久免费视频| 国产精品女同久久久久电影院| 久久一区二区免费播放| 欧美亚洲国产精品久久蜜芽 | 精品无码久久久久国产动漫3d| 亚洲天堂久久精品| 久久精品欧美日韩精品| 亚洲女久久久噜噜噜熟女| 日本久久中文字幕| 久久国产精品二国产精品| 久久国产亚洲精品无码| 无码专区久久综合久中文字幕| 日韩欧美亚洲综合久久影院Ds | 久久精品成人影院| www.久久热.com| 99久久人妻无码精品系列| 人妻精品久久久久中文字幕69| 偷偷做久久久久网站| 久久久久18| 久久精品国产色蜜蜜麻豆| 国产精品一区二区久久精品无码| 久久久久亚洲精品男人的天堂| 久久福利青草精品资源站免费| 国产亚洲精久久久久久无码| 精品久久久久久久久午夜福利|