如何调试驱动程序加载错误?

问题描述 投票:0回答:6

我已经制作了Windows驱动程序,对其进行了编译,并尝试通过SC管理器启动它,但是我从SC管理器API中收到系统错误:

ERROR_PROC_NOT_FOUND The specified procedure could not be found.

是否有一种方法可以获取有关驱动程序为何无法正确启动的更多信息?WinDbg还是什么?如果我注释掉DriverEntry例程中的所有代码,则驱动程序启动。

我唯一要说的是另一个源模块中的过程(尽管在我自己的项目中)。我可以注释掉所有外部依赖项,但仍然出现相同的错误。

编辑:我还尝试了不同的DDK,即2003 DDK和Vista WDK(但没有Win7 WDK)

Edit2:这是我的驱动程序源代码文件driver.cpp:

#ifdef __cplusplus
extern "C" {
#endif
#include <ntddk.h>
#include <ntstrsafe.h>
#ifdef __cplusplus
}; // extern "C"
#endif

#include "../distorm/src/distorm.h"

void DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
}

#define MAX_INSTRUCTIONS 20

#ifdef __cplusplus
extern "C" {
#endif
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
 UNICODE_STRING pFcnName;

 // Holds the result of the decoding.
 _DecodeResult res;
 // Decoded instruction information.
 _DecodedInst decodedInstructions[MAX_INSTRUCTIONS];
 // next is used for instruction's offset synchronization.
 // decodedInstructionsCount holds the count of filled instructions' array by the decoder.
 unsigned int decodedInstructionsCount = 0, i, next;
 // Default decoding mode is 32 bits, could be set by command line.
 _DecodeType dt = Decode32Bits;

 // Default offset for buffer is 0, could be set in command line.
 _OffsetType offset = 0;
 char* errch = NULL;

 // Buffer to disassemble.
 char *buf;
 int len = 100;

 // Register unload routine
 DriverObject->DriverUnload = DriverUnload;

 DbgPrint("diStorm Loaded!\n");

 // Get address of KeBugCheck
 RtlInitUnicodeString(&pFcnName, L"KeBugCheck");
 buf = (char *)MmGetSystemRoutineAddress(&pFcnName);
 offset = (unsigned) (_OffsetType)buf;

 DbgPrint("Resolving KeBugCheck @ 0x%08x\n", buf);
 // Decode the buffer at given offset (virtual address).

 while (1) {
  res = distorm_decode(offset, (const unsigned char*)buf, len, dt, decodedInstructions, MAX_INSTRUCTIONS, &decodedInstructionsCount);
  if (res == DECRES_INPUTERR) {
   DbgPrint(("NULL Buffer?!\n"));
   break;
  }

  for (i = 0; i < decodedInstructionsCount; i++) {
   // Note that we print the offset as a 64 bits variable!!!
   // It might be that you'll have to change it to %08X...
   DbgPrint("%08I64x (%02d) %s %s %s\n", decodedInstructions[i].offset, decodedInstructions[i].size, 
    (char*)decodedInstructions[i].instructionHex.p,
    (char*)decodedInstructions[i].mnemonic.p,
    (char*)decodedInstructions[i].operands.p);
  }

  if (res == DECRES_SUCCESS || decodedInstructionsCount == 0) {
   break; // All instructions were decoded.
  }

  // Synchronize:
  next = (unsigned int)(decodedInstructions[decodedInstructionsCount-1].offset - offset);
  next += decodedInstructions[decodedInstructionsCount-1].size;

  // Advance ptr and recalc offset.
  buf += next;
  len -= next;
  offset += next;
 }

 DbgPrint(("Done!\n"));
 return STATUS_SUCCESS;
}

#ifdef __cplusplus
}; // extern "C"
#endif

我的目录结构是这样的:

base_dir\driver\driver.cpp
        \distorm\src\all_the_c_files
        \distorm\distorm.h
        \distorm\config.h

我的来源文件:

# $Id$
TARGETNAME=driver
TARGETPATH=obj
TARGETTYPE=DRIVER

# Additional defines for the C/C++ preprocessor
C_DEFINES=$(C_DEFINES) -DSUPPORT_64BIT_OFFSET

SOURCES=driver.cpp \
     distorm_dummy.c \
        drvversion.rc

INCLUDES=..\distorm\src;

TARGETLIBS=$(DDK_LIB_PATH)\ntdll.lib \
        $(DDK_LIB_PATH)\ntstrsafe.lib

您可以从这里下载diStorm:http://ragestorm.net/distorm/dl.php?id=8

distorm_dummy与diStorm库中的dummy.c相同。

c windows kernel driver
6个回答
2
投票

不足为奇,您拥有自行解决此问题所需的所有信息。

ERROR_PROC_NOT_FOUND找不到指定的过程。

与此结合,您的依赖项Walker输出中,很多都指向损坏的Import Table

为什么您的IT坏了?我不确定,可能是您的构建/链接器设置存在问题,因为很明显,HAL.DLL就在%windir%\ system32中。

导致订单中断的原因很多,您必须自己进行跟踪。


3
投票

使用gflag启用“显示加载器快照”-在调试输出中,您应该找到有关加载器无法解析的导入的信息。


1
投票

您是否尝试过在已编译的.sys上运行Dependency Walker,并查看是否确实缺少一些函数导入?


0
投票

您可以在WinDbg中添加延迟的断点。

如果指定了断点,则在未加载驱动程序(或使用bu)时,当驱动程序加载并进入函数时,它将被触发。

指定断点的命令是:

bp <module_name>!<function_name>

例如:

bp my_driver!DriverEntry

0
投票

使用6000 WDK / DDK进行构建(因为使用“实际的” Build 7600 ...它与wdfldr.sys链接,但是在Windows Vista和XP系统下,该sys文件不可用)。我不知道您可以在哪里正式下载它,但我确实使用了洪流...


0
投票

尝试在VS中更改目标OS。

© www.soinside.com 2019 - 2024. All rights reserved.