阅读:1269回复:3
哪位老大能不能给我讲一讲这段代码怎么理解?
这两天研究了一下packet例子,对其中枚举网卡的这部分代码始终无法理解.代码如下:
BOOLEAN EnumAdapters( HWND hWnd ) { HANDLE hFile; ULONG bytesReturned; TCHAR *buffer; UINT i; memset(Buffer, 0, sizeof(Buffer)); hFile=CreateFile(TEXT("\\\\.\\Packet"), GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0 ); if(hFile == INVALID_HANDLE_VALUE) { MessageBox(hWnd, TEXT("Driver is not loaded. Try reloading the app."), TEXT("Error!"), MB_OK); return FALSE; } if(!DeviceIoControl(hFile, IOCTL_ENUM_ADAPTERS, NULL, 0, Buffer, sizeof(Buffer), &bytesReturned, NULL )) { MessageBox(hWnd, TEXT("Enum ioctl failed"), TEXT("Error!"), MB_OK); return FALSE; } buffer = (TCHAR *)Buffer; // // Parse the output and fill the AdaptersInfo structure // AdaptersInfo.NumAdapters = *(PULONG)buffer; (PCHAR)buffer += sizeof(ULONG); i = 0; AdaptersInfo.AdapterName = (LPTSTR)buffer; while (*(buffer++)) { while (*(buffer++)) { ; } AdaptersInfo.SymbolicLink = (LPTSTR)buffer; while (*(buffer++)) { ; } if(++i == MAX_ADAPTERS) break; AdaptersInfo.AdapterName = (LPTSTR)buffer; } CloseHandle(hFile); return TRUE; } 我的电脑中有一块Realtek的网卡,仿照上面的代码我写了个显示网卡信息的程序,其中有MessageBox(hwnd,(LPTSTR)AdaptersInfo.AdapterName[0],TEXT("网卡"),MB_OK),可运行后MessageBox只显示R. 哪位老大能不能具体讲一下Buffer的具体结构?多谢先. |
|
沙发#
发布于:2004-04-06 10:54
老兄,你记住一点底层的TCHAR都是UNICODE的,如果你这样一个取法,那肯定只有一个R了。
记得把UNICODE转化ANSI就可以了,我想问题就在这里在RING3级就使用WideCharToMultiBytes。试试吧! Reply by Kilo(110i@110i.net) Milstone(TM) - http://www.110i.net |
|
|
板凳#
发布于:2004-04-06 11:18
搞不定啊.
我改动了一下程序. TCHAR *s; WideCharToMultiBytes(CP_ACP,WC_NO_BEST_FIT_CHARS,AdaptersInfo.AdapterName[0],-1,s,0,NULL,NULL); MessageBox(hwnd,(LPTSTR)s,TEXT("网卡信息"),MB_OK); 下面是编译时的错误: Linking... VpnM.obj : error LNK2001: unresolved external symbol _WideCharToMultiBytes Debug/VpnM.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. [编辑 - 4/6/04 by yzw999] |
|
地板#
发布于:2004-04-06 15:59
搞定了.
其实没那么复杂.只需要一句话:#define UNICODE 1就行了. |
|