gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:20:20 37 4
gpt4 key购买 nike

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

它带有一个名为 uiotest 的测试工具

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

当我使用 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 路径和 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() 失败并返回 INVALID_HANDLE_VALUE

最佳答案

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

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

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

寻址设备对象命名

\\.\NdisProt

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

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

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

编辑:如果还存在 Unicode 与 ANSI 问题 float ,那么您应该检查您的代码,找出将窄字符串传递给需要宽字符串的 API 的地方并修复它们。

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

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

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

然而,获得处理翻译的宏魔法权TCHAR将 s 转换为已知表示是一种痛苦。

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

关于c - 在 Visual Studio 2005 中使用 WinDDK 测试实用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/841947/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com