補完情報 m(__)m

 「ら・ぶ・り・ぃ☆ OS/2 WARP volume.3」のコピー誌内記事「ちょっと偏ったOS/2プログラミングTips」のセクション1.4から1.41にかけての記事が欠落しておりましたので,以下に掲載いたします.





1.4. 楽しいデバイスIOCtl

なかなか利用する機会がないデバイスIOCtl。知れば知るほど使い甲斐があると思うんですが(激私見)、中にはしょうもない用途に使えるのもあるので紹介しておきましょう。

その前に、まずはデバイスをオープンするための関数を用意しておきましょう。

#define INCL_BASE
#define INCL_ERRORS
#define <os2.h>
 
/* デバイスドライバーをIOCtl用にオープンする関数
   戻り : DosOpen()の戻り値 */
APIRET DosOpenDevice4IOCtl(
    PHFILE phfDevice,  /* ファイルハンドルを戻す変数へのポインター */
    PSZ pszDeviceName  /* デバイスファイル名へのポインター */
)
{
    ULONG ulDosOpenAction;
    return DosOpen(pszDeviceName,
                   phfDevice,
                   &ulDosOpenAction,
                   (ULONG)0,
                   (ULONG)0,
                   OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
                   OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE |
                     OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT,
                   (PEAOP2)NULL);
}
 
/* 論理ドライブをオープンする関数
   戻り : DosOpen()の戻り値 */
APIRET DosOpenDASD(
    PHFILE phfDASD,      /* ファイルハンドルを戻す変数へのポインター */
    UCHAR ucLogicalDrive /* 論理ドライブ文字 */
)
{
    ULONG ulDosOpenAction;
    UCHAR aucFileDASD[4];
/*  aucFileDASD[0] = ucLogicalDrive;
    aucFileDASD[1] = (UCHAR)':';
    aucFileDASD[2] = (UCHAR)'\0';
    aucFileDASD[3] = (UCHAR)'\0'; */
    *((PULONG)&aucFileDASD[0]) = ((ULONG)ucLogicalDrive << 0) +
                                     ((ULONG)':' << 8) +
                                     ((ULONG)'\0' << 16) +
                                     ((ULONG)'\0' << 24);
    return DosOpen((PSZ)&aucFileDASD[0],
                   phfDASD,
                   &ulDosOpenAction,
                   (ULONG)0,
                   (ULONG)0,
                   OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
                   OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE |
                     OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
                     OPEN_FLAGS_DASD,
                   (PEAOP2)NULL);
}

毎回DosOpen()を見て思うんですが、DosOpen()ってパラメーター多過ぎ(笑)


1.4.1. キーボードLEDの制御

大抵のキーボードにはNumLock、CapsLock、ScrollLockの3つのLEDが付いているようです。それではちょっとこれをいぢってみましょう。

キーボードドライバーのファイル名は\DEV\KBD$です。まず先のDosOpenDevice4IOCtl()でオープンしてファイルハンドルを取得しておいて下さい。