Как отладить ошибку загрузки драйвера? - PullRequest
0 голосов
/ 13 ноября 2009

Я сделал драйвер для Windows, скомпилировал его и попытался запустить его через менеджер SC, но я получаю системную ошибку от API менеджера SC:

ERROR_PROC_NOT_FOUND The specified procedure could not be found.

Есть ли способ получить больше информации о том, почему именно драйвер не запускается? WinDbg или что-то? Если я закомментирую весь код в моей подпрограмме DriverEntry, драйвер запустится.

Единственное, что я вызываю, - это процедура в другом исходном модуле (хотя в моем собственном проекте). Я могу закомментировать все внешние зависимости и все равно получаю ту же ошибку.

Edit:
Я также пробовал разные 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

Файл My SOURCES:

# $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 - это то же самое, что и dummy.c из библиотеки diStorm.

Ответы [ 5 ]

3 голосов
/ 13 ноября 2009

Включите «Показывать привязки загрузчика» с помощью gflags - в выходных данных отладки вы должны найти информацию о том, какой импорт загрузчик не может разрешить.

2 голосов
/ 21 ноября 2009

Не удивительно, что у вас есть вся информация, необходимая для решения этой проблемы самостоятельно.

ERROR_PROC_NOT_FOUND Указанная процедура не найдена.

Это, в сочетании с выходом Walker для зависимостей, в значительной степени указывает на неправильную таблицу импорта

Почему ваша ИТ сломана? Я не уверен, что это может быть проблемой с настройками вашей сборки / компоновщика, поскольку, очевидно, HAL.DLL находится прямо в% windir% \ system32.

Причин неправильного заказа на загрузку много, и вам придется самостоятельно их отследить.

1 голос
/ 20 ноября 2009

Вы пытались запустить Dependency Walker на скомпилированном .sys и посмотреть, есть ли на самом деле некоторые недостающие функции импорта?

0 голосов
/ 15 февраля 2010

Создайте его с помощью 6000 WDK / DDK (потому что с «фактической» сборкой 7600 ... он ссылается на wdfldr.sys, но в системах Windows Vista и XP этот файл sys недоступен). Я не знаю, где вы можете скачать его официально, но я использовал торрент ...

0 голосов
/ 13 ноября 2009

Вы можете добавить отложенные точки останова в WinDbg.

Если вы укажете точку останова, когда драйвер не загружен (или с помощью bu), она сработает, когда драйвер действительно загрузится и войдет в функцию.

Команда для указания точек останова:

bp <module_name>!<function_name>

например. :

bp my_driver!DriverEntry
...