2010-06-03 4 views
4

Я попытался использовать функцию под названием NTCreateFile. Когда я скомпилировал его, он дал мне ошибку: «Идентификатор _NTCreateFile не найден». Я включил заголовок winternl.h. Итак, я попытался использовать ZwCreatFile, в соответствии с MSDN я включил ntifs.h, но я не могу включить этот заголовок. В нем говорится: «Невозможно открыть/найти каталог». Я использую V @ 2008. В чем проблема? Я что-то пропустил?Не удалось включить ntifs.h в проект 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; 
} 

Когда он пытается вызвать, что он дает следующее сообщение об ошибке в окне сообщений. ОШИБКА: Ошибка проверки времени выполнения # 0 - Значение ESP не было должным образом сохранено во время вызова функции. Обычно это результат вызова функции, объявленной с одним вызовом, с указателем функции, объявленным с другим соглашением о вызовах.

+0

Вы должны публиковать выходные сообщения компилятора verbatim (копия и вставка будут проще и точнее, чем описание *); важно знать, является ли это ошибкой компоновщика или компилятора (сообщение сообщит нам об этом). Очевидно, что файл не найден, это пропроцессорная ошибка, но как насчет * до * вашей попытки исправить исходную проблему? – Clifford

ответ

4

Если вы читали MSDN documentation, первый абзац говорит:

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

Который говорит, что: (я выделил важные части)

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.

Таким образом, вы будете иметь, чтобы загрузить функции вы хотите использовать их с NtDll.dll, прежде чем сможете их использовать.

Вот не проверенная пример пример кода:

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

спасибо за ответ ур ereOn, мне понравилось то, что вы предложили, но снова есть ошибка RunTime..пожалуйста, проверьте мое изменение далее – kiddo

+0

@kiddo: Ваша последняя ошибка довольно ясна: вы пытаетесь вызвать метод, используя другое соглашение о вызове ", чем тот, для которого он был составлен. Что делать, если вы попробуете один из них перед объявлением функции: '__cdecl',' __stdcall' (** возможно, это один) или '__fastcall'? Я отредактировал свой ответ, чтобы добавить интересную часть. – ereOn

+0

это сработало, но оно не получило никакой дескриптор файла..пожалуйста, помогите мне, если у вас есть знания о функции NtCreateFile – kiddo

1

ZwCreateFile является частью драйверов Windows, а не Windows SDK. Вам нужно будет установить комплект драйверов. Некоторые макросы и типы, используемые NTCreateFile, также требуют заголовки WDK. Это четко указано в документации по MSDN.

1

Как ясно указано в сообщении об ошибке, вы получили неправильное соглашение о вызове, вы уронили NTAPI. Это должно быть:

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

Правильная инициализация myAttributes, как правило, важна. Я не вижу, чтобы вы делали что-либо, что могло бы вызвать вызов недокументированной функции API-интерфейса. Придерживайтесь CreateFile(), сколько сможете.

+0

yup, это сработало..бат ничего не делал..понял об этой функции..NtcreatFile – kiddo

+0

Собственный Windows API недокументирован, я не должен ничего знать об этом. Несомненно, он сделал что-то *, какова функция возвращаемого значения? –

+0

его значение для мусора..большое отрицательное значение – kiddo

1

Несколько возможностей:

  • Вы говорите, что сообщение об ошибке "_NTCreateFile идентификатор не найден". Имя API: NtCreateFile() (обратите внимание на нижний регистр «t»). Возможно, вы просто используете неправильное имя.

  • ntifs.h и связанные библиотеки ссылок включены в комплект драйверов для Windows (WDK), который можно скачать здесь: http://www.microsoft.com/whdc/devtools/wdk/wdkpkg.mspx. Вы должны иметь возможность использовать WDK, чтобы делать то, что хотите немного больше, чем использовать динамическую компоновку. но тогда вам, как правило, приходится покупать новую систему сборки или определять, как интегрировать заголовки и библиотеки в вашу текущую сборку.

  • Вы можете использовать dynamic linking technique outlined by ereOn.

Смежные вопросы