﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-vfdff-随笔分类-technic</title><link>http://www.cppblog.com/vfdff/category/6864.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 21 Nov 2020 06:20:24 GMT</lastBuildDate><pubDate>Sat, 21 Nov 2020 06:20:24 GMT</pubDate><ttl>60</ttl><item><title>C++中的mutable和volatile</title><link>http://www.cppblog.com/vfdff/archive/2020/11/21/217512.html</link><dc:creator>vfdff</dc:creator><author>vfdff</author><pubDate>Sat, 21 Nov 2020 03:25:00 GMT</pubDate><guid>http://www.cppblog.com/vfdff/archive/2020/11/21/217512.html</guid><wfw:comment>http://www.cppblog.com/vfdff/comments/217512.html</wfw:comment><comments>http://www.cppblog.com/vfdff/archive/2020/11/21/217512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vfdff/comments/commentRss/217512.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vfdff/services/trackbacks/217512.html</trackback:ping><description><![CDATA[ 参考 https://blog.csdn.net/FX677588/article/details/74615658

1、在C++中，mutable是为了突破const的限制而设置的。被mutable修饰的变量，将永远处于可变的状态，即使在一个const函数中，甚至结构体变量或者类对象为const，其mutable成员也可以被修改，对业务逻辑的约束
2、volatile是一个类型修饰符。volatile修饰的数据,编译器不可对其进行执行期寄存器于寄存器的优化。这种特性,是为了满足多线程同步、中断、硬件编程等特殊需要。遇到这个关键字声明的变量，编译器对访问该变量的代码就不再进行优化，从而可以提供对特殊地址的直接访问，对编译器的优化约束<img src ="http://www.cppblog.com/vfdff/aggbug/217512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vfdff/" target="_blank">vfdff</a> 2020-11-21 11:25 <a href="http://www.cppblog.com/vfdff/archive/2020/11/21/217512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中加载驱动程序</title><link>http://www.cppblog.com/vfdff/archive/2008/09/20/VC_driver_program.html</link><dc:creator>vfdff</dc:creator><author>vfdff</author><pubDate>Sat, 20 Sep 2008 09:38:00 GMT</pubDate><guid>http://www.cppblog.com/vfdff/archive/2008/09/20/VC_driver_program.html</guid><wfw:comment>http://www.cppblog.com/vfdff/comments/62358.html</wfw:comment><comments>http://www.cppblog.com/vfdff/archive/2008/09/20/VC_driver_program.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vfdff/comments/commentRss/62358.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vfdff/services/trackbacks/62358.html</trackback:ping><description><![CDATA[从KProcCheck的代码里提取出来的，不用安装驱动程序，自己的程序里要用的时候用HANDLE openDriver(void)加载驱动，用完了void uninstallDriver(void)卸载。使用时还需自己修改，代码不难，看下就明白了。<br><br><br>代码如下：<br><br>//HANDLE openDriver(void)打开驱动建立的符号链接的句柄<br>//void uninstallDriver(void)卸载驱动，要把openDriver打开的句柄关闭才可以成功卸载<br><br>#include &lt;windows.h&gt;<br><br>#define DRV_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "DLPORTIO"//驱动名<br>#define DRV_FILENAME&nbsp;&nbsp;&nbsp;&nbsp; "DLPORTIO.sys"//驱动文件<br><br>#define STATUS_SUCCESS&nbsp;&nbsp;&nbsp;&nbsp; ((NTSTATUS)0x00000000L)<br><br><br>typedef LONG NTSTATUS;<br><br>typedef struct _STRING {<br>&nbsp; USHORT&nbsp; Length;<br>&nbsp; USHORT&nbsp; MaximumLength;<br>&nbsp; PCHAR&nbsp; Buffer;<br>} ANSI_STRING, *PANSI_STRING;<br><br>typedef struct _UNICODE_STRING {<br>&nbsp; USHORT&nbsp; Length;<br>&nbsp; USHORT&nbsp; MaximumLength;<br>&nbsp; PWSTR&nbsp; Buffer;<br>} UNICODE_STRING, *PUNICODE_STRING;<br><br>//*********************************************************************************************<br>// Assign loaddriver priviledge to our process, so we can load our support driver.<br>//<br>//*********************************************************************************************<br><br>BOOL getLoadDriverPriv()<br>{<br>&nbsp;HANDLE hToken;<br><br>&nbsp;if(OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &amp;hToken))<br>&nbsp;{<br>&nbsp; LUID huid;<br>&nbsp; if(LookupPrivilegeValue(NULL, "SeLoadDriverPrivilege", &amp;huid))<br>&nbsp; {<br>&nbsp;&nbsp; LUID_AND_ATTRIBUTES priv;<br>&nbsp;&nbsp; priv.Attributes = SE_PRIVILEGE_ENABLED;<br>&nbsp;&nbsp; priv.Luid = huid;<br><br>&nbsp;&nbsp; TOKEN_PRIVILEGES tp;<br>&nbsp;&nbsp; tp.PrivilegeCount = 1;<br>&nbsp;&nbsp; tp.Privileges[0] = priv;<br><br>&nbsp;&nbsp; if(AdjustTokenPrivileges(hToken, FALSE, &amp;tp, 0, NULL, NULL))<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; return TRUE;<br>&nbsp;&nbsp; }<br>&nbsp; }<br>&nbsp;}<br>&nbsp;return FALSE;<br>}<br><br><br>//*********************************************************************************************<br>// Sets up the necessary registry settings to load the support driver<br>//<br>//*********************************************************************************************<br><br>BOOL setupRegistry()<br>{<br>&nbsp;HKEY hkey;<br>&nbsp;if(RegCreateKey(HKEY_LOCAL_MACHINE, "System\CurrentControlSet\Services\"DRV_NAME, &amp;hkey) != ERROR_SUCCESS)<br>&nbsp; return FALSE;<br><br>&nbsp;DWORD val;<br>&nbsp;val = 1;<br>&nbsp;if(RegSetValueEx(hkey, "Type", 0, REG_DWORD, (PBYTE)&amp;val, sizeof(val)) != ERROR_SUCCESS)<br>&nbsp; return FALSE;<br><br>&nbsp;if(RegSetValueEx(hkey, "ErrorControl", 0, REG_DWORD, (PBYTE)&amp;val, sizeof(val)) != ERROR_SUCCESS)<br>&nbsp; return FALSE;<br>&nbsp;<br>&nbsp;val = 3;<br>&nbsp;if(RegSetValueEx(hkey, "Start", 0, REG_DWORD, (PBYTE)&amp;val, sizeof(val)) != ERROR_SUCCESS)<br>&nbsp; return FALSE;<br><br>&nbsp;char *imgName = "System32\DRIVERS\"DRV_FILENAME;<br>&nbsp;<br>&nbsp;if(RegSetValueEx(hkey, "ImagePath", 0, REG_EXPAND_SZ, (PBYTE)imgName, strlen(imgName)) != ERROR_SUCCESS)<br>&nbsp; return FALSE;<br><br>&nbsp;return TRUE;<br>}<br><br><br>//*********************************************************************************************<br>// Actual code to load our driver into memory<br>//<br>//*********************************************************************************************<br><br>BOOL loadDriver()<br>{<br>&nbsp;// call ntdll APIs<br>&nbsp;HMODULE hntdll;<br><br>&nbsp;NTSTATUS (WINAPI *_RtlAnsiStringToUnicodeString)(PUNICODE_STRING&nbsp; DestinationString,IN PANSI_STRING&nbsp; SourceString,IN <br><br>BOOLEAN);<br><br>&nbsp;VOID (WINAPI *_RtlInitAnsiString)<br>&nbsp; (IN OUT PANSI_STRING&nbsp; DestinationString,<br>&nbsp;&nbsp; IN PCHAR&nbsp; SourceString);<br><br>&nbsp;NTSTATUS (WINAPI * _ZwLoadDriver)<br>&nbsp; (IN PUNICODE_STRING DriverServiceName);<br><br>&nbsp;NTSTATUS (WINAPI * _ZwUnloadDriver)<br>&nbsp; (IN PUNICODE_STRING DriverServiceName);<br><br>&nbsp;VOID (WINAPI * _RtlFreeUnicodeString)<br>&nbsp; (IN PUNICODE_STRING&nbsp; UnicodeString);<br><br><br>&nbsp;hntdll = GetModuleHandle("ntdll.dll");<br>&nbsp;&nbsp; <br>&nbsp;*(FARPROC *)&amp;_ZwLoadDriver = GetProcAddress(hntdll, "NtLoadDriver");<br><br>&nbsp;*(FARPROC *)&amp;_ZwUnloadDriver = GetProcAddress(hntdll, "NtUnloadDriver");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;*(FARPROC *)&amp;_RtlAnsiStringToUnicodeString = <br>&nbsp;&nbsp; GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString");<br><br>&nbsp;*(FARPROC *)&amp;_RtlInitAnsiString = <br>&nbsp;&nbsp; GetProcAddress(hntdll, "RtlInitAnsiString");<br><br>&nbsp;*(FARPROC *)&amp;_RtlFreeUnicodeString = <br>&nbsp;&nbsp; GetProcAddress(hntdll, "RtlFreeUnicodeString");<br><br>&nbsp;if(_ZwLoadDriver &amp;&amp; _ZwUnloadDriver &amp;&amp; _RtlAnsiStringToUnicodeString &amp;&amp;<br>&nbsp;&nbsp;&nbsp; _RtlInitAnsiString &amp;&amp; _RtlFreeUnicodeString)<br>&nbsp;{<br>&nbsp; ANSI_STRING aStr;<br>&nbsp; <br>&nbsp; _RtlInitAnsiString(&amp;aStr, <br>&nbsp; "\Registry\Machine\System\CurrentControlSet\Services\"DRV_NAME);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; UNICODE_STRING uStr;<br><br>&nbsp; if(_RtlAnsiStringToUnicodeString(&amp;uStr, &amp;aStr, TRUE) != STATUS_SUCCESS)<br>&nbsp;&nbsp; return FALSE;<br>&nbsp; else<br>&nbsp; {<br>&nbsp;&nbsp; if(_ZwLoadDriver(&amp;uStr) == STATUS_SUCCESS)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; _RtlFreeUnicodeString(&amp;uStr);<br>&nbsp;&nbsp;&nbsp; return TRUE;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; _RtlFreeUnicodeString(&amp;uStr);<br>&nbsp; }<br>&nbsp;}<br><br>&nbsp;return FALSE;<br>}<br><br><br>//*********************************************************************************************<br>// Actual code to remove our driver from memory<br>//<br>//*********************************************************************************************<br><br>BOOL unloadDriver()<br>{<br>&nbsp;// call ntdll APIs<br>&nbsp;HMODULE hntdll;<br>&nbsp;NTSTATUS (WINAPI * _RtlAnsiStringToUnicodeString)<br>&nbsp; (PUNICODE_STRING&nbsp; DestinationString,<br>&nbsp;&nbsp; IN PANSI_STRING&nbsp; SourceString,<br>&nbsp;&nbsp; IN BOOLEAN);<br><br>&nbsp;VOID (WINAPI *_RtlInitAnsiString)<br>&nbsp; (IN OUT PANSI_STRING&nbsp; DestinationString,<br>&nbsp;&nbsp; IN PCHAR&nbsp; SourceString);<br><br>&nbsp;NTSTATUS (WINAPI * _ZwLoadDriver)<br>&nbsp; (IN PUNICODE_STRING DriverServiceName);<br><br>&nbsp;NTSTATUS (WINAPI * _ZwUnloadDriver)<br>&nbsp; (IN PUNICODE_STRING DriverServiceName);<br><br>&nbsp;VOID (WINAPI * _RtlFreeUnicodeString)<br>&nbsp; (IN PUNICODE_STRING&nbsp; UnicodeString);<br><br><br>&nbsp;hntdll = GetModuleHandle("ntdll.dll");<br>&nbsp;&nbsp; <br>&nbsp;*(FARPROC *)&amp;_ZwLoadDriver = GetProcAddress(hntdll, "NtLoadDriver");<br><br>&nbsp;*(FARPROC *)&amp;_ZwUnloadDriver = GetProcAddress(hntdll, "NtUnloadDriver");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;*(FARPROC *)&amp;_RtlAnsiStringToUnicodeString = <br>&nbsp;&nbsp; GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString");<br><br>&nbsp;*(FARPROC *)&amp;_RtlInitAnsiString = <br>&nbsp;&nbsp; GetProcAddress(hntdll, "RtlInitAnsiString");<br><br>&nbsp;*(FARPROC *)&amp;_RtlFreeUnicodeString = <br>&nbsp;&nbsp; GetProcAddress(hntdll, "RtlFreeUnicodeString");<br><br>&nbsp;if(_ZwLoadDriver &amp;&amp; _ZwUnloadDriver &amp;&amp; _RtlAnsiStringToUnicodeString &amp;&amp;<br>&nbsp;&nbsp;&nbsp; _RtlInitAnsiString &amp;&amp; _RtlFreeUnicodeString)<br>&nbsp;{<br>&nbsp; ANSI_STRING aStr;<br>&nbsp; <br>&nbsp; _RtlInitAnsiString(&amp;aStr, <br>&nbsp; "\Registry\Machine\System\CurrentControlSet\Services\"DRV_NAME);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; UNICODE_STRING uStr;<br><br>&nbsp; if(_RtlAnsiStringToUnicodeString(&amp;uStr, &amp;aStr, TRUE) != STATUS_SUCCESS)<br>&nbsp;&nbsp; return FALSE;<br>&nbsp; else<br>&nbsp; {<br>&nbsp;&nbsp; if(_ZwUnloadDriver(&amp;uStr) == STATUS_SUCCESS)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; _RtlFreeUnicodeString(&amp;uStr);<br>&nbsp;&nbsp;&nbsp; return TRUE;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; _RtlFreeUnicodeString(&amp;uStr);<br>&nbsp; }<br>&nbsp;}<br><br>&nbsp;return FALSE;<br>}<br><br><br>//*********************************************************************************************<br>// Removes our driver file and registry settings<br>//<br>//*********************************************************************************************<br><br>void cleanupDriver(void)<br>{<br>&nbsp;char sysDir[MAX_PATH + 1];<br>&nbsp;GetSystemDirectory(sysDir, MAX_PATH);<br>&nbsp;strncat(sysDir, "\drivers\"DRV_FILENAME, MAX_PATH);<br>&nbsp;DeleteFile(sysDir);<br><br>&nbsp;RegDeleteKey(HKEY_LOCAL_MACHINE, "System\CurrentControlSet\Services\"DRV_NAME"\Enum");<br>&nbsp;RegDeleteKey(HKEY_LOCAL_MACHINE, "System\CurrentControlSet\Services\"DRV_NAME);<br>}<br><br><br>//*********************************************************************************************<br>// Attempts to get a handle to our kernel driver.&nbsp; If fails, try to install the driver.<br>//<br>//*********************************************************************************************<br><br>HANDLE openDriver(void)<br>{<br>&nbsp;HANDLE hDevice;<br>&nbsp;//CreateFile打开驱动建立的符号链接，得根据驱动中建立的名字更改<br>&nbsp;hDevice = CreateFile("\\.\"DRV_NAME, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);<br><br>&nbsp;if(hDevice == INVALID_HANDLE_VALUE)<br>&nbsp;{&nbsp; <br>&nbsp; char drvFullPath[MAX_PATH+1];<br>&nbsp; char *filePart;<br><br>&nbsp; ZeroMemory(drvFullPath, MAX_PATH);&nbsp; <br>&nbsp; GetFullPathName(DRV_FILENAME, MAX_PATH, drvFullPath, &amp;filePart);<br>&nbsp; <br>&nbsp; //printf("%s ", drvFullPath);<br>&nbsp; HANDLE hFile = CreateFile(drvFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_NORMAL, 0);<br>&nbsp; if(hFile == INVALID_HANDLE_VALUE)<br>&nbsp; {<br>&nbsp;&nbsp; //printf("Cannot find required driver file %s ", drvFullPath);<br>&nbsp;&nbsp; AfxMessageBox("Cannot find required driver file");<br>&nbsp;&nbsp; return INVALID_HANDLE_VALUE;<br>&nbsp; }<br>&nbsp; else<br>&nbsp; {<br>&nbsp;&nbsp; CloseHandle(hFile);<br><br>&nbsp;&nbsp; char sysDir[MAX_PATH + 1];<br>&nbsp;&nbsp; GetSystemDirectory(sysDir, MAX_PATH);<br>&nbsp;&nbsp; strncat(sysDir, "\drivers\"DRV_FILENAME, MAX_PATH);<br>&nbsp;&nbsp; CopyFile(drvFullPath, sysDir, TRUE);<br><br>&nbsp;&nbsp; if(!getLoadDriverPriv())<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; //printf("Error getting load driver privilege! ");<br>&nbsp;&nbsp;&nbsp; AfxMessageBox("Error getting load driver privilege! ");<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; else<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; if(!setupRegistry())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; //printf("Error setting driver registry keys! Make sure you are running this as <br><br>Administrator. ");<br>&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox("Error setting driver registry keys! Make sure you are running this as <br><br>Administrator. ");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; loadDriver();<br>&nbsp;&nbsp;&nbsp;&nbsp; hDevice = CreateFile("\\.\"DRV_NAME, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ <br><br>| FILE_SHARE_WRITE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp; if(hDevice == INVALID_HANDLE_VALUE)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //printf("Error loading kernel support driver! Make sure you are running <br><br>this as Administrator. ");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox("Error loading kernel support driver! Make sure you are <br><br>running this as Administrator. ");<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox("loading kernel support driver success");<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; cleanupDriver();<br>&nbsp; }<br>&nbsp;}<br>&nbsp;<br>&nbsp;return hDevice;<br>}<br><br><br>//*********************************************************************************************<br>// Remove our kernel driver from memory<br>//<br>//*********************************************************************************************<br><br>void uninstallDriver(void)<br>{<br>&nbsp;char drvFullPath[MAX_PATH+1];<br>&nbsp;char *filePart;<br><br>&nbsp;ZeroMemory(drvFullPath, MAX_PATH);&nbsp; <br>&nbsp;GetFullPathName(DRV_FILENAME, MAX_PATH, drvFullPath, &amp;filePart);<br><br>&nbsp;HANDLE hFile = CreateFile(drvFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_NORMAL, 0);<br>&nbsp;if(hFile == INVALID_HANDLE_VALUE)<br>&nbsp;{<br>&nbsp; //printf("Cannot find required driver file %s ", drvFullPath);<br>&nbsp; AfxMessageBox("Cannot find required driver file ");<br>&nbsp; return;<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{<br>&nbsp; CloseHandle(hFile);<br><br>&nbsp; char sysDir[MAX_PATH + 1];<br>&nbsp; GetSystemDirectory(sysDir, MAX_PATH);<br>&nbsp; strncat(sysDir, "\drivers\"DRV_FILENAME, MAX_PATH);<br>&nbsp; CopyFile(drvFullPath, sysDir, TRUE);<br><br>&nbsp; if(!getLoadDriverPriv())<br>&nbsp; {<br>&nbsp;&nbsp; //printf("Error getting load driver privilege! ");<br>&nbsp;&nbsp; AfxMessageBox("Error getting load driver privilege! ");<br>&nbsp; }<br>&nbsp; else<br>&nbsp; {<br>&nbsp;&nbsp; if(!setupRegistry())<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; //printf("Error setting driver registry keys! Make sure you are running this as <br><br>Administrator. ");<br>&nbsp;&nbsp;&nbsp; AfxMessageBox("Error setting driver registry keys! Make sure you are running this as <br><br>Administrator. ");<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; else<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; if(unloadDriver())<br>&nbsp;&nbsp;&nbsp;&nbsp; //printf("Support driver successfully unloaded. ");<br>&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox("Support driver successfully unloaded. ");<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp; //printf("Unload support driver failed.&nbsp; It is probably not loaded. ");<br>&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox("Unload support driver failed.&nbsp; It is probably not loaded. ");<br>&nbsp;&nbsp; }<br>&nbsp; }<br>&nbsp; cleanupDriver();<br>&nbsp;}<br>}<br><br><br><br><img src ="http://www.cppblog.com/vfdff/aggbug/62358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vfdff/" target="_blank">vfdff</a> 2008-09-20 17:38 <a href="http://www.cppblog.com/vfdff/archive/2008/09/20/VC_driver_program.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>