2009-11-13 3 views
0

J'ai fait un pilote pour Windows, compilé et essayé de le lancer via le gestionnaire SC, mais je reçois l'erreur du système de l'API du gestionnaire de SC:Comment déboguer l'erreur de chargement du pilote?

ERROR_PROC_NOT_FOUND The specified procedure could not be found. 

Y at-il un moyen d'obtenir plus d'informations sur pourquoi exactement le pilote ne parvient pas à démarrer? WinDbg ou quelque chose? Si je commente tout le code dans ma routine DriverEntry, le pilote démarre.

La seule chose que je vous appelle est une procédure dans un autre module source (dans mon propre projet, cependant). Je peux commenter toutes les dépendances externes et j'ai toujours la même erreur.

Edit:
J'ai aussi essayé différentes DDK, soit 2003 DDK und Vista WDK (mais pas Win7 WDK)

Edit2: Voici mon fichier code sour pilote 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 

Ma structure de répertoire est comme ceci:

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

Mes sources fichier:

# $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 

Vous pouvez télécharger diStorm d'ici: http://ragestorm.net/distorm/dl.php?id=8

distorm_dummy est le même que le dummy.c du diStorm lib.

+0

Pourriez-vous s'il vous plaît publier le fichier source et peut-être le fichier .cpp de votre pilote? – Christopher

+0

Je ne peux pas vraiment tester/construire le pilote actuellement, donc ... Pourriez-vous essayer de supprimer la partie externe "C" autour de DriverEntry, car elle est superflue. – Christopher

+0

si je les supprime, je reçois des erreurs de construction: erreur LNK2019: symbole externe non résolu _DriverEntry @ 8 référencé dans la fonction _GsDriverEntry @ 8 \t 1> ..... driver \ bufferoverflowk.lib – SDD

Répondre

2

Sans surprise, vous avez toutes les informations dont vous avez besoin pour résoudre ce vous-même.

ERROR_PROC_NOT_FOUND La procédure spécifiée est introuvable.

Ceci, combiné avec votre dépendance sortie Walker, des points à peu près à un cassé Import Table

Pourquoi votre IT brisé? Je ne suis pas sûr, pourrait être un problème avec vos paramètres de construction/éditeur de liens, car de toute évidence, HAL.DLL est juste là dans% windir% \ system32.

Les raisons d'un ordre de chargement rompu sont nombreuses et vous devrez les repérer vous-même.

+0

L'erreur était parce que j'ai inclus TARGETLIBS = $ (DDK_LIB_PATH) \ ntdll.lib Après avoir supprimé cela de SOURCES, le pilote fonctionne – SDD

0

Vous pouvez ajouter des points d'arrêt différés dans WinDbg.

Si vous spécifiez un point d'arrêt, alors que le conducteur ne soit pas chargé (ou bu), il sera déclenché, lorsque le conducteur ne soit chargé et entre dans la fonction.

La commande pour les points d'arrêt est specifiying:

bp <module_name>!<function_name> 

par exemple, :

bp my_driver!DriverEntry 
+0

bien que je l'ai dit, le conducteur n'est pas ' t même chargé du tout. J'ai besoin de savoir pourquoi c'est le cas – SDD

+0

Et pour cela, vous spécifiez votre point d'arrêt dans la fonction DriverEntry, de sorte que, lorsque la fonction est exécutée, votre point d'arrêt se déclenche et vous passez à travers votre code. – Christopher

+0

Le bp ne se déclenche jamais, car la fonction d'entrée du pilote n'est jamais appelée. Le pilote semble échouer * pendant que le système d'exploitation le charge - pas après qu'il a été chargé – SDD

3

activez l'option « Afficher chargeur se mette » à l'aide gflags - dans la sortie de débogage, vous devriez trouver des informations sur les importer le chargeur ne peut pas résoudre.

+0

ne semble pas fonctionner. Je l'utilise comme ceci:! Glaf + sls, mais le WinDbg ci-joint ne montre aucun message de débogage – SDD

1

Avez-vous essayé de courir Dependency Walker sur les .sys compilées et voir s'il y a effectivement certaines importations de fonctions manquantes?

+0

Dependencie Walker me dit 4 erreurs: "Erreur lors de l'ouverture du fichier Le système ne trouve pas le fichier spécifié (2)" pour les fichiers CI.DLL, CLFS.SYS, HAL.DLL et KDCOM.DLL – SDD

0

Construisez-le avec le 6000 WDK/DDK (car avec le "réel" Build 7600 ... il est lié à wdfldr.sys, mais sous Windows Vista et XP Systems ce fichier sys n'est pas disponible). Je ne sais pas où vous pouvez le télécharger officiellement, mais j'ai utilisé un torrent ...

Questions connexes