Last Updated 2005/08/05
Programming Tips Windows  索 引 
VxDのCreateFile
2005/08/05

1. xxxx.VXD ファイルを CreateFile() でロード

xxxx.VXD ファイルをパスの通った場所におく.
CreateFile("\\\\.\\xxxx.VXD", ...) する.VxD 名に拡張子があればファイル名と判断して,パスからファイルを検索する.
(xxxx.VXD の xxxx の部分と DEF で指定する内部モジュール名とが一致している場合のみ)

2. 既にロードされている VxD や Win95 標準 VxD を CreateFile()

".VXD" の拡張子無しで CreateFile() する.("\\\\.\\VWIN32" など)
拡張子を付けない場合は内部モジュール名と判断され,ロード済み VxD リストを検索する.(正確には先にレジストリを検索)

例えば MYVXD.VXD (内部モジュール名 MYVXD) を作ったとすると,最初のロード時 (未ロード時) は CreateFile("\\\\.\\MYVXD.VXD", ...) とする必要があるが,誰かが MYVXD をロードしそれがまだメモリに張り付いているのであれば,その後は "\\\\.\\MYVXD.VXD" でも "\\\\.\\MYVXD" でも成功する.
(MYVXD.VXD は PATH の通った所にあるものとする)

Windows\System\ の下にある .VXD ファイルの中には,このルールに合致しない奴とかいて,不安定である.(static VxD だとどうだとかかもしれない)
static VxD の場合は、system.ini でロードさせておき,拡張子無しで CreateFile() するのが良い.
自作の Dynamic VxD で試す分には,上のルールに合致する.

CreateFile() に渡す VxD 名に関しては,Win95 SDK の HELP に書いてある.
"Programmer's Guide" の "Using Windows 95 Features" の下に DeviceIoControl 関係の記述が見つかるはずである.

以下が VC++2.0 でのサンプルである.
Console アプリとしてビルドして,「(program_name) VWIN32」とか「(program_name) CVXDSAMP.VXD」 等でテストする.

#include 
#include 
int  main( int ac, char * * av )
{
    char    vxdpath[64];
    HANDLE  hvxd;
 
    sprintf(vxdpath, "\\\\.\\%s", av[1]);
    hvxd = CreateFile(vxdpath, 0, 0, 0, 0, FILE_FLAG_DELETE_ON_CLOSE, 0);
    if ( INVALID_HANDLE_VALUE == hvxd ) {
        printf("%s load failed (%lu).\n", vxdpath, GetLastError());
        return  1;
    }
    printf("%s was loaded as handle %u.\n", vxdpath, hvxd);
    CloseHandle(hvxd);
    return  0;
}


参照
物理アドレス使用
前後のTips
VxDのCreateFile

DSS ProgrammingTipsCGI Ver2.02