2010-06-03 17 views
4

J'ai essayé d'utiliser la fonction appelée NTCreateFile. Quand j'ai compilé cela m'a donné une erreur en disant "_NTCreateFile identifiant non trouvé". J'ai inclus l'en-tête winternl.h. Alors, j'ai essayé d'utiliser ZwCreatFile, MSDN j'ai inclus ntifs.h, mais je ne suis pas en mesure d'inclure cet en-tête. Il dit "impossible d'ouvrir/trouver le répertoire". J'utilise V @ 2008. Quel est le problème? Est-ce que je manque quelque chose?Impossible d'inclure ntifs.h dans le projet win32

EDIT1:

typedef NTSTATUS (*fp_CreatFile)(
    OUT PHANDLE FileHandle, 
    IN ACCESS_MASK DesiredAccess, 
    IN POBJECT_ATTRIBUTES ObjectAttributes, 
    OUT PIO_STATUS_BLOCK IoStatusBlock, 
    IN PLARGE_INTEGER AllocationSize OPTIONAL, 
    IN ULONG FileAttributes, 
    IN ULONG ShareAccess, 
    IN ULONG CreateDisposition, 
    IN ULONG CreateOptions, 
    IN PVOID EaBuffer OPTIONAL, 
    IN ULONG EaLength 
    ); 
OBJECT_ATTRIBUTES myAttributes; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    fp_CreatFile myFunction; 
    HMODULE module = LoadLibrary(L"ntdll.dll"); 
    if(NULL != module) 
    { 
     myFunction = (fp_CreatFile)GetProcAddress(module,"NtCreateFile"); 
    } 

    UNICODE_STRING string; 
    IO_STATUS_BLOCK fileStatus; 
    string.Length = 56; 
    string.Buffer = L"C:\\user\\kiddo\\Desktop\\7zFM.exe"; 
    string.MaximumLength = 56; 

    HANDLE fileHandle; 
    myAttributes.ObjectName = &string; 
    myAttributes.Length = sizeof(OBJECT_ATTRIBUTES); 
    long mystatus = myFunction(&fileHandle,FILE_GENERIC_READ,&myAttributes ,&fileStatus,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ, 
     NULL,NULL,NULL,NULL); 
    return 0; 
} 

Quand il essaie d'appeler qui lui donne l'erreur suivante dans une boîte de message. ERREUR: Echec de la vérification de l'exécution n ° 0 - La valeur de l'ESP n'a pas été enregistrée correctement lors d'un appel de fonction. Ceci est généralement le résultat de l'appel d'une fonction déclarée avec une convention d'appel avec un pointeur de fonction déclaré avec une convention d'appel différente.

+0

Vous devriez publier les messages de sortie du compilateur verbatim (un copier-coller serait plus simple et plus précis qu'une * description *); il est important de savoir s'il s'agit ou non d'une erreur de l'éditeur de liens ou du compilateur (le message nous le dirait). De toute évidence, le fichier introuvable est une erreur pro-processeur, mais qu'en est-il * avant * votre tentative de résoudre le problème d'origine? – Clifford

Répondre

4

Si vous lisez le MSDN documentation, le premier alinéa dit:

Note Before using this function, please read Calling Internal APIs .

qui dit que: (je mis en évidence les parties importantes)

The Winternl.h header file exposes prototypes of internal Windows APIs. There is no associated import library, so developers must use run-time dynamic linking to call the functions described in this header file.

The functions and structures in Winternl.h are internal to the operating system and subject to change from one release of Windows to the next, and possibly even between service packs for each release. To maintain the compatibility of your application, you should use the equivalent public functions instead. Further information is available in the header file, Winternl.h, and the documentation for each function.

If you do use these functions, you can access them through run-time dynamic linking using LoadLibrary and GetProcAddress. This gives your code an opportunity to respond gracefully if the function has been changed or removed from the operating system. Signature changes, however, may not be detectable.

donc vous devrez charger les fonctions que vous vouloir utiliser de NtDll.dll avant de pouvoir les utiliser.

Voici un exemple de code exemple non testé:

typedef NTSTATUS (__stdcall *NtCreateFile)(
    OUT PHANDLE FileHandle, 
    IN ACCESS_MASK DesiredAccess, 
    IN POBJECT_ATTRIBUTES ObjectAttributes, 
    OUT PIO_STATUS_BLOCK IoStatusBlock, 
    IN PLARGE_INTEGER AllocationSize OPTIONAL, 
    IN ULONG FileAttributes, 
    IN ULONG ShareAccess, 
    IN ULONG CreateDisposition, 
    IN ULONG CreateOptions, 
    IN PVOID EaBuffer OPTIONAL, 
    IN ULONG EaLength 
    ); 

NtCreateFile _NtCreateFile = (NtCreateFile)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateFile"); 

// You can now use the function 
_NtCreateFile(/* params */); 

// Don't forget the release the resources 
+0

merci pour votre réponse ereOn, j'ai aimé ce que vous avez suggéré mais il y a encore une erreur RunTime..Veuillez vérifier mon edit plus loin – kiddo

+0

@kiddo: Votre dernière erreur est assez claire: vous essayez d'appeler une méthode en utilisant une autre convention d'appel "que celui pour lequel il a été compilé. Que faire si vous en essayez un en face de votre déclaration de fonction: '__cdecl',' __stdcall' (** probablement celui-ci **) ou '__fastcall'? J'ai édité ma réponse pour ajouter la partie intéressante. – ereOn

+0

cela a fonctionné, mais il n'a pas reçu n'importe quel handle de fichier .. s'il vous plaît m'aider si vous avez des connaissances sur la fonction NtCreateFile – kiddo

1

ZwCreateFile fait partie du Windows Driver Kit, pas le SDK de Windows. Vous devez installer le kit de pilote. Certaines macros et types utilisés par NTCreateFile nécessitent également des en-têtes WDK. Cela est clairement indiqué dans la documentation sur MSDN.

1

Comme indiqué clairement par le message d'erreur, la convention d'appel est incorrecte, vous avez supprimé NTAPI. Il devrait être:

typedef NTSTATUS (__stdcall * fp_CreatFile)(
    // etc.. 
); 

Initialiser correctement myAttributes serait normalement important. Je ne vois pas que vous fassiez quoi que ce soit qui justifie l'appel de la fonction API native non documentée. Stick avec CreateFile() aussi longtemps que vous le pouvez.

+0

yup, il worked..but il n'a pas fait quelque chose .. avoir une idée de cette fonction .. NtcreatFile – kiddo

+0

L'API Windows native est non documentée, je ne suis pas censé savoir quoi que ce soit à ce sujet. Certes, il a fait * quelque chose *, quelle est la valeur de retour de la fonction? –

+0

sa valeur de poubelle..une grande valeur négative – kiddo

1

Plusieurs possibilités:

  • Vous dites que le message d'erreur est "identifiant _NTCreateFile introuvable". Le nom de l'API est NtCreateFile() (notez le 't' en minuscule). Il est possible que vous utilisiez simplement le mauvais nom.

  • ntifs.h et les bibliothèques de liens connexes sont inclus dans le Windows Driver Kit (WDK), qui peut être téléchargé ici: http://www.microsoft.com/whdc/devtools/wdk/wdkpkg.mspx. Vous devriez être en mesure d'utiliser le WDK pour faire ce que vous voulez un peu plus directement que d'utiliser la liaison dynamique. mais alors vous devez généralement acheter dans un nouveau système de construction ou comprendre comment intégrer les en-têtes et les bibliothèques dans votre construction actuelle. Vous pouvez utiliser dynamic linking technique outlined by ereOn.