Использование тестовых утилит WinDDK с Visual Studio 2005 - PullRequest
1 голос
/ 09 мая 2009

В настоящее время я пытаюсь запустить драйвер NdisProt, предоставленный WinDDK 2003. Я успешно собрал и установил драйвер.

Поставляется с тестовой утилитой uiotest

Когда я собираю утилиту с make, она работает правильно.

Когда я создаю пустое приложение Win32 с Visual Studio 2005, оно не может подключиться к драйверу во время CreateFile( "\\.\\NdisProt" [...]) `. Вызов всегда возвращает неверный дескриптор. Я подозреваю, что мой проект построен не так, как с make. Вот содержимое файла «sources», используемого make

TARGETNAME=uiotest
TARGETPATH=obj
TARGETTYPE=PROGRAM

C_DEFINES=$(C_DEFINES) -D_WIN32WIN_

# MSC_WARNING_LEVEL=/W4

UMTYPE=console
USE_MSVCRT=1

TARGETLIBS=\
    $(SDK_LIB_PATH)\user32.lib

INCLUDES=..\sys

SOURCES=\
    uiotest.c

Я добавил путь к lib и включил путь к своему проекту

вот что делает возврат из окружения ддк

cl -nologo -Ii386\ -I. -ID:\WINDDK\3790~1.183\inc\mfc42 -I..\sys -Iobjfre_wxp_x8
6\i386 -ID:\WINDDK\3790~1.183\inc\wxp -ID:\WINDDK\3790~1.183\inc\wxp -ID:\WINDDK
\3790~1.183\inc\crt -D_X86_=1 -Di386=1  -DSTD_CALL -DCONDITION_HANDLING=1   -DNT
_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0501 /DWINVER=0x0501
 -D_WIN32_IE=0x0603    -DWIN32_LEAN_AND_MEAN=1 -DDEVL=1 -D__BUILDMACHINE__=WinDD
K -DFPO=0  -DNDEBUG -D_DLL=1 -D_MT=1  -D_WIN32WIN_     /c /Zl /Zp8 /Gy /Gm-  /W3
 /WX /Gz  /GX-  /GR- /GF /GS /G6 /Ze /Gi- /QIfdiv- /hotpatch -Z7 /Oxs  /Oy-   -F
ID:\WINDDK\3790~1.183\inc\wxp\warning.h   .\uiotest.c
uiotest.c
        link -out:objfre_wxp_x86\i386\uiotest.exe -machine:ix86 @C:\Temp\nm88BE.
tmp
Microsoft (R) Incremental Linker Version 7.10.4035
Copyright (C) Microsoft Corporation.  All rights reserved.

-MERGE:_PAGE=PAGE
-MERGE:_TEXT=.text
-SECTION:INIT,d
-OPT:REF
-OPT:ICF
-IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221
-INCREMENTAL:NO
-FULLBUILD
/release
-NODEFAULTLIB
/WX
-debug
-debugtype:cv
-version:5.1
-osversion:5.1
/functionpadmin:5
/safeseh
/opt:nowin98
-merge:.rdata=.text
/pdbcompress
-STACK:0x40000,0x2000
/tsaware
-subsystem:console,4.00
-base:@D:\WINDDK\3790~1.183\bin\coffbase.txt,usermode
-entry:mainCRTStartup
objfre_wxp_x86\i386\uiotest.obj
D:\WINDDK\3790~1.183\lib\wxp\i386\BufferOverflowU.lib
D:\WINDDK\3790~1.183\lib\crt\i386\msvcrt.lib
D:\WINDDK\3790~1.183\lib\wxp\i386\advapi32.lib
D:\WINDDK\3790~1.183\lib\wxp\i386\kernel32.lib
D:\WINDDK\3790~1.183\lib\wxp\i386\user32.lib
D:\WINDDK\3790~1.183\lib\wxp\i386\sehupd.lib

Я не слишком уверен в том, что нужно проверять, чтобы знать, что происходит, поэтому любая помощь будет полезна. Новый проект компилируется и запускается, но CreateFile() завершается неудачно с INVALID_HANDLE_VALUE

Ответы [ 2 ]

3 голосов
/ 09 мая 2009

Возможно, это не вся проблема, но одна вещь, которая выпадает из приведенного кода, это вызов CreateFile("\\.\\NdisProt",...). Правильный путь к объекту в пространстве имен ядра начинается с двух обратных косых черт, каждый из которых должен быть удвоен в строке C. У меня были проблемы с языком разметки, используемым в SO, который был перепутан с обратными слешами в прошлом, поэтому я позволил себе отредактировать ваш вопрос, чтобы убедиться, что вижу имя, которое вы намеревались представить, и исправить разметку, чтобы сохранить это намерение.

Итак, имя, используемое для создания дескриптора объекта устройства, должно выглядеть как

CreateFile("\\\\.\\NdisProt",...)

для адресации объекта устройства с именем

\\.\NdisProt

Я понятия не имею, есть ли какие-либо другие проблемы, или даже если это правильное имя, экспортированное этим драйвером.

Образцы DDK, как правило, пишутся так, чтобы не зависеть от таких вещей, как MFC, ATL, WTL и тому подобное. Это приводит к некоему стилю стиля в коде, но имеет то преимущество, что примеры могут быть построены с помощью цепочки инструментов, которая изначально поставлялась с самим DDK, и относительно независимы от выбора используемого набора инструментов.

Обратите внимание, что если вы попытаетесь действительно отладить драйвер, вам может потребоваться отследить вызов из кода режима пользователя через ядро ​​и в соответствующие биты драйвера. Сделать это с помощью отладчика ядра проще, если код пользовательского режима максимально прост. Это также может объяснить стиль, используемый в примере кода.

Редактировать: Если существует также плавающая проблема Unicode и ANSI, то вы должны проверить свой код на наличие мест, где узкие строки передаются в API, которые ожидают широкие строки и исправляют их.

Одним из простых решений было бы переключиться на компиляцию ANSI для всех API Windows. Конечно, теперь у вас есть проблемы с именами файлов, которые содержат национальные символы, которых нет в вашей текущей кодовой странице, поскольку нет способа гарантировать, что имя файла Unicode может быть правильно переведено в ANSI и из него.

Единственное исправление, которое может быть «достаточно хорошим», - сделать строковые константы широкими, написав их L"...". Однако теперь ваш код гарантированно не будет переносимым обратно к компиляции ANSI, поэтому обязательно используйте утверждение времени компиляции, чтобы убедиться, что определено UNICODE, и тогда вы получите хорошее сообщение об ошибке.

Похоже, что на вечеринке в Microsoft никогда не используют char или wchar_t, а вместо этого используют TCHAR. Заголовок <tchar.h> содержит макросы сопоставления, которые позволяют объявлять и использовать строки в API Windows и в библиотеках времени выполнения C, выбирая широкий или узкий API во время компиляции. Возможно, это правильное действие в приложении Windows, поскольку оно уже не очень переносимо на другие платформы.

Однако, получение магии магии для правильного перевода TCHAR s в известное представление - это боль.

Независимо от того, какую технику вы выберете, я не вижу выхода из тщательного и полного анализа кода для предположений об обработке строк и представлении символов.

0 голосов
/ 11 мая 2009

Половина:

CreateFile ссылается на CreateFileW, который ожидает Unicode-строку. Когда я заставляю CreateFileA это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...