C 在Visual Studio 2005中使用WinDDK测试实用程序

C 在Visual Studio 2005中使用WinDDK测试实用程序,c,winapi,driver,wdk,C,Winapi,Driver,Wdk,我目前正在尝试运行WinDDK 2003提供的NdisProt驱动程序。我已经成功构建并安装了驱动程序 它附带了一个名为uiotest的测试实用程序 当我使用构建实用程序时,请确保它正确运行 当我使用Visual Studio 2005创建空白的win32应用程序解决方案时,它无法在CreateFile(“\\.\\NdisProt”[…])期间连接到驱动程序。调用始终返回无效句柄。我怀疑我的项目与make的构建不完全相同。以下是make使用的“源”文件的内容 TARGETNAME=uiotes

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

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

当我使用构建实用程序时,请确保它正确运行

当我使用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路径和include路径添加到我的项目中

以下是从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()
失败,句柄值无效这可能不是全部问题,但从引用的代码中跳出来的一件事是调用
CreateFile(“\\\.\\NdisProt”,…)
。内核名称空间中对象的正确路径名以两个反斜杠开始,每个反斜杠都需要在C字符串中加倍。我在使用标记语言时遇到了一些问题,因此在过去被反斜杠弄糊涂了,所以我冒昧地编辑了您的问题,以确保我看到了您打算显示的名称,并修复了标记以保留该意图

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

CreateFile("\\\\.\\NdisProt",...)
要寻址名为的设备对象

\\.\NdisProt
我不知道是否还有其他问题,甚至不知道该驱动程序导出的名称是否正确

DDK示例通常编写为不依赖于MFC、ATL、WTL等内容。这在代码中产生了一种僵硬的风格,但它的好处是,可以使用DDK本身最初附带的工具链构建示例,并且与所使用的工具链的选择相对独立

请注意,如果最终尝试真正调试驱动程序,则可能需要跟踪从用户模式代码到内核以及驱动程序相关位的调用。如果用户模式代码尽可能简单,那么使用内核调试器就更容易了。这也可以解释示例代码中使用的样式

编辑:如果还存在Unicode与ANSI的浮动问题,那么您应该检查代码中窄字符串传递给期望宽字符串的API的位置,并修复它们

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

一个可能“足够好”的修复方法是通过将字符串常量写入
L“…”
使其变宽。但是,现在可以保证您的代码不会移植回ANSI编译,因此请确保使用编译时断言来验证
UNICODE
是否已定义,以便获得正确的错误消息

微软的派对路线似乎是从不使用
char
wchar\u t
,而是使用
TCHAR
。标头提供映射宏,通过在编译时选择宽API或窄API,可以在Windows API和C运行时库中声明和使用字符串。可以说,在Windows应用程序中这样做是正确的,因为它已经不能很好地移植到其他平台

然而,将
TCHAR
s转换为已知表示法的宏魔法是一件痛苦的事情

无论您选择哪种技术,对于字符串处理和字符表示假设,我看不出有任何办法可以进行仔细、完整的代码检查。

Half-soved:


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

将窄字符串传递给CreateFileW可能会在编译程序时生成编译器警告。还有哪些编译器警告您没有告诉我们?