2009-05-08 7 views
1

現在、WinDDK 2003で提供されているNdisProtドライバを実行しようとしています。ドライバを正しくビルドしてインストールしました。Visual Studio 2005でWinDDKテストユーティリティを使用する

それは、私はそれが正しく実行メイクとユーティリティを構築する場合

uiotestという名前のテストユーティリティが付属しています。

Visual Studio 2005で空のwin32アプリケーションソリューションを作成すると、CreateFile("\\.\\NdisProt" [...]) `の間にドライバに接続できません。呼び出しは常に無効なハンドルを返します。私のプロジェクトはmakeとまったく同じではないと思われます。ここで私はlibにパスを追加し、ここに私のプロジェクトへのパス

が含まれてきた

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 

を作ることで使用される「ソース」ファイルの内容は、DDKのenvironement

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で失敗します

答えて

3

全体的に問題はないかもしれませんが、引用されたコードから飛び出るものはCreateFile("\\.\\NdisProt",...)です。カーネル名空間内のオブジェクトの正しいパス名は2つのバックスラッシュで始まります。それぞれのバックスラッシュはC文字列で2倍にする必要があります。私は過去のバックスラッシュと混同されているマークアップ言語に問題があったので、あなたの質問を編集して、あなたが提示しようとしていた名前を見ていることを確認し、マークアップを修正して意図。

ので、デバイスオブジェクトへのハンドルを作成するために使用される名前は、他の問題がある場合、私は見当がつかないという名前のデバイスオブジェクト

\\.\NdisProt 

に対処する

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

のようになります。 、またはそれがそのドライバによってエクスポートされた正しい名前であっても。

DDKサンプルは、通常、MFC、ATL、WTLなどのようなものに依存しないように書かれています。この結果、コード内に一種のスティルスタイルが発生しますが、サンプルは、最初にDDK自体に同梱されていたツールチェーンを使用して構築でき、使用するツールチェーンの選択から比較的独立しているという利点があります。

実際にドライバをデバッグしようとすると、ユーザモードコードからカーネルを通して、そしてドライバの関連するビットに呼び出しを追跡する必要があるかもしれないことに注意してください。ユーザーモードのコードができるだけシンプルであれば、カーネルデバッガを使用する方が簡単です。これは、サンプルコードで使用されるスタイルについても説明します。

編集:また、浮動UnicodeのANSI対問題がある場合は、あなたが狭い文字列をワイド文字列を期待し、それらを修正するAPIに渡された場所のためにあなたのコードを確認する必要があります。

簡単な修正プログラムは、すべてのWindows APIのANSIコンパイルに切り替えることです。もちろん、Unicodeファイル名がANSIとの間で正しく変換されることを保証する方法がないため、現在のコードページにない国別文字を含むファイル名に問題があります。

文字列定数を「L"..."」と書くことで、文字列定数をワイドにすることが「十分」である可能性があります。しかし、今ではあなたのコードはANSIコンパイルに移植できないことが保証されていますので、コンパイル時のアサーションを使用してUNICODEが定義されていることを確認してから、適切なエラーメッセージが表示されるようにしてください。

マイクロソフトのパーティラインは、charまたはwchar_tのいずれかを使用するのではなく、代わりにTCHARを使用するように思われます。ヘッダー<tchar.h>は、コンパイル時にワイドAPIまたはナローAPIを選択することによって、Windows APIおよびCランタイムライブラリで文字列を宣言して使用できるマッピングマクロを提供します。おそらく、これはWindowsアプリケーションでは正しいことですが、他のプラットフォームには移植できません。

しかし、TCHARを既知の表現に変換することに対処するマクロマジックを正しく取得することは苦痛です。

どのテクニックを選択しても、文字列処理と文字表現の前提条件について、慎重で完全なコードレビューを行うことはできません。

0

半分soved:

のCreateFileは、Unicode文字列を待つCreateFileWを参照しています。私はCreateFileAを強制的に働かせます。

+1

狭い文字列をCreateFileWに渡すと、プログラムをコンパイルするときにコンパイラの警告が生成される可能性があります。他にどのようなコンパイラの警告がありますか? – bk1e

関連する問題