yzw999
驱动牛犊
驱动牛犊
  • 注册日期2004-03-26
  • 最后登录2010-02-04
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1269回复:3

哪位老大能不能给我讲一讲这段代码怎么理解?

楼主#
更多 发布于:2004-04-06 10:04
这两天研究了一下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的具体结构?多谢先.
yuke
驱动牛犊
驱动牛犊
  • 注册日期2001-09-02
  • 最后登录2009-04-09
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-06 10:54
老兄,你记住一点底层的TCHAR都是UNICODE的,如果你这样一个取法,那肯定只有一个R了。

记得把UNICODE转化ANSI就可以了,我想问题就在这里在RING3级就使用WideCharToMultiBytes。试试吧!

Reply by Kilo(110i@110i.net)
Milstone(TM) - http://www.110i.net
[color=blue]
yzw999
驱动牛犊
驱动牛犊
  • 注册日期2004-03-26
  • 最后登录2010-02-04
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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]
yzw999
驱动牛犊
驱动牛犊
  • 注册日期2004-03-26
  • 最后登录2010-02-04
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-06 15:59
搞定了.
其实没那么复杂.只需要一句话:#define UNICODE 1就行了.
游客

返回顶部