1

我目前正在尝试运行 WinDDK 2003 提供的 NdisProt 驱动程序。我已经成功构建并安装了驱动程序。

它带有一个名为 uiotest 的测试实用程序

当我使用 make 构建实用程序时,它可以正常运行。

当我使用 Visual Studio 2005 创建一个空白的 win32 应用程序解决方案时,它无法在CreateFile( "\\.\\NdisProt"[...])` 期间连接到驱动程序。该调用始终返回无效句柄。我怀疑我的项目与使用 make 构建的项目不完全相同。这是make使用的“源”文件的内容

TARGETNAME=uiotest
TARGETPATH=obj
TARGETTYPE=PROGRAM

C_DEFINES=$(C_DEFINES) -D_WIN32WIN_

# MSC_WARNING_LEVEL=/W4

UMTYPE=console
USE_MSVCRT=1

TARGETLIBS=\
    $(SDK_LIB_PATH)\user32.lib

INCLUDES=..\sys

SOURCES=\
    uiotest.c

我已经添加了 lib 路径和包含路径到我的项目

这是从 ddk 环境中获得回报的原因

cl -nologo -Ii386\ -I. -ID:\WINDDK\3790~1.183\inc\mfc42 -I..\sys -Iobjfre_wxp_x8
6\i386 -ID:\WINDDK\3790~1.183\inc\wxp -ID:\WINDDK\3790~1.183\inc\wxp -ID:\WINDDK
\3790~1.183\inc\crt -D_X86_=1 -Di386=1  -DSTD_CALL -DCONDITION_HANDLING=1   -DNT
_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0501 /DWINVER=0x0501
 -D_WIN32_IE=0x0603    -DWIN32_LEAN_AND_MEAN=1 -DDEVL=1 -D__BUILDMACHINE__=WinDD
K -DFPO=0  -DNDEBUG -D_DLL=1 -D_MT=1  -D_WIN32WIN_     /c /Zl /Zp8 /Gy /Gm-  /W3
 /WX /Gz  /GX-  /GR- /GF /GS /G6 /Ze /Gi- /QIfdiv- /hotpatch -Z7 /Oxs  /Oy-   -F
ID:\WINDDK\3790~1.183\inc\wxp\warning.h   .\uiotest.c
uiotest.c
        link -out:objfre_wxp_x86\i386\uiotest.exe -machine:ix86 @C:\Temp\nm88BE.
tmp
Microsoft (R) Incremental Linker Version 7.10.4035
Copyright (C) Microsoft Corporation.  All rights reserved.

-MERGE:_PAGE=PAGE
-MERGE:_TEXT=.text
-SECTION:INIT,d
-OPT:REF
-OPT:ICF
-IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221
-INCREMENTAL:NO
-FULLBUILD
/release
-NODEFAULTLIB
/WX
-debug
-debugtype:cv
-version:5.1
-osversion:5.1
/functionpadmin:5
/safeseh
/opt:nowin98
-merge:.rdata=.text
/pdbcompress
-STACK:0x40000,0x2000
/tsaware
-subsystem:console,4.00
-base:@D:\WINDDK\3790~1.183\bin\coffbase.txt,usermode
-entry:mainCRTStartup
objfre_wxp_x86\i386\uiotest.obj
D:\WINDDK\3790~1.183\lib\wxp\i386\BufferOverflowU.lib
D:\WINDDK\3790~1.183\lib\crt\i386\msvcrt.lib
D:\WINDDK\3790~1.183\lib\wxp\i386\advapi32.lib
D:\WINDDK\3790~1.183\lib\wxp\i386\kernel32.lib
D:\WINDDK\3790~1.183\lib\wxp\i386\user32.lib
D:\WINDDK\3790~1.183\lib\wxp\i386\sehupd.lib

我不太确定要检查什么才能知道发生了什么,所以任何帮助都会很明显。新项目编译并运行,但CreateFile()失败并显示 INVALID_HANDLE_VALUE

4

2 回答 2

3

这可能不是全部问题,但从引用的代码中跳出来的一件事是 call CreateFile("\\.\\NdisProt",...)。内核名称空间中对象的正确路径名以两个反斜杠开头,每个反斜杠都需要在 C 字符串中加倍。过去我在 SO 使用的标记语言被反斜杠混淆时遇到过问题,所以我冒昧地编辑了你的问题,以确保我看到你打算呈现的名称,并修复标记以保留它意图。

因此,用于创建设备对象句柄的名称应如下所示

CreateFile("\\\\.\\NdisProt",...)

寻址名为的设备对象

\\.\NdisProt

我不知道是否还有其他问题,或者即使那是该驱动程序导出的正确名称。

DDK 示例通常被编写为不依赖于 MFC、ATL、WTL 等。这导致代码中有一种做作的风格,但它的好处是可以使用最初随 DDK 本身附带的工具链构建示例,并且相对独立于所使用的工具链的选择。

请注意,如果您最终尝试真正调试驱动程序,则可能需要通过内核跟踪来自用户模式代码的调用并进入驱动程序的相关位。如果用户模式代码尽可能简单,那么使用内核调试器执行此操作会更容易。这也可以解释示例代码中使用的样式。

编辑:如果还有浮动的 Unicode 与 ANSI 问题,那么您应该检查您的代码以查找将窄字符串传递给期望宽字符串的 API 并修复它们的地方。

一种简单的修复方法是为所有 Windows API 切换到 ANSI 编译。当然,现在您遇到了包含当前代码页中没有的国家字符的文件名的问题,因为无法保证 Unicode 文件名可以正确地转换为 ANSI 或从 ANSI 转换。

一种可能“足够好”的修复方法是通过编写字符串常量来使​​它们变宽L"..."。但是,现在保证您的代码不能移植回 ANSI 编译器,因此请务必使用编译时断言来验证UNICODE已定义,以便您得到一个好的错误消息。

微软的党派路线似乎是从不使用任何一个,char或者wchar_t改为使用TCHAR. 标头<tchar.h>提供映射宏,通过在编译时选择宽或窄 API,允许在 Windows API 和 C 运行时库中声明和使用字符串。可以说,这是在 Windows 应用程序中正确的做法,因为它已经不能很好地移植到其他平台。

然而,让宏魔法正确处理将TCHARs 转换为已知表示是一件痛苦的事情。

无论您选择哪种技术,我都认为没有任何办法可以对字符串处理和字符表示假设进行仔细和完整的代码审查。

于 2009-05-08T21:55:24.597 回答
0

解决了一半:

CreateFile 正在引用等待 unicode 字符串的 CreateFileW。当我强制 CreateFileA 它工作。

于 2009-05-11T14:03:10.420 回答