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

时间:2009-05-08 21:42:15

标签: c winapi driver wdk

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

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

当我构建实用程序时,使其正确运行。

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

使用的“sources”文件的内容
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 environement

返回的内容
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

2 个答案:

答案 0 :(得分:3)

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

因此,用于创建设备对象句柄的名称应该类似于

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

解决名为

的设备对象
\\.\NdisProt

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

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

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

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

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

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

Microsoft的派对似乎是从不使用charwchar_t,而是使用TCHAR。标头<tchar.h>提供映射宏,允许在编译时通过选择宽API或窄API在Windows API和C运行时库中声明和使用字符串。可以说,这在Windows应用程序中是正确的,因为它已经不能轻松移植到其他平台。

然而,让宏观魔法处理将TCHAR翻译成已知代表的权利是一种痛苦。

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

答案 1 :(得分:0)

一半解决了:

CreateFile引用CreateFileW,它等待unicode字符串。当我强制使用CreateFile时,它可以工作。