SSブログ

NtDisplayString/NtDelayExecution [CodeTips]

今回はWindows ネイティブの実行ファイルを作成します。
Win32の実行ファイルではないので、エクスプローラなどからは実行できません。後述する様にレジストリを編集してPC起動時に実行する様にします。

ソースファイル名 'ntdisplay.cpp'
#include <ntddk.h>

EXTERN_C
NTSTATUS
NTAPI
NtDisplayString(
    PUNICODE_STRING String
    );

EXTERN_C
NTSTATUS
NTAPI
NtDelayExecution( 
    BOOLEAN Alertable,
    PLARGE_INTEGER Interval
    );

void __cdecl main()
{
    UNICODE_STRING s;

    RtlInitUnicodeString(&s,L"Hello world!\n");
    NtDisplayString( &s );

    LARGE_INTEGER li;
    li.QuadPart = -(10 * 10000000); // wait for relative 10 sec
    NtDelayExecution( FALSE, &li );
}

作成するのがネイティブ実行ファイルなので、WDKは必須といえます。今回も使い慣れたWindows 7のWDKを使用します。

Windows Driver Kit Version 7.1.0

(もちろん、コンパイルやリンカの設定を自前で行えば、VisualStudioなどに添付された開発環境でもバイナリを生成できる筈です)

WDKでビルドする為に必要なsourcesファイルとmakefileも示しておきます。これらをソースファイルと同じディレクトリに置き、buildコマンドでビルドします。

ファイル名 'sources'
TARGETTYPE=PROGRAM
TARGETNAME=ntdisplay
TARGETPATH=obj
UMTYPE=nt

_NT_TARGET_VERSION=$(_NT_TARGET_VERSION_WINXP)

MINWIN_SDK_LIB_PATH=$(DDK_LIB_PATH)

INCLUDES=$(DDK_INC_PATH)

SOURCES=ntdisplay.cpp

LINKLIBS=$(DDK_LIB_PATH)\ntdll.lib

ファイル名 'makefile'
!INCLUDE $(NTMAKEENV)\makefile.def


このプログラムは特に何もしません。PCを起動(再起動)すると、画面に10秒間"Hello World!"と表示して終了します。

    RtlInitUnicodeString(&s,L"Hello world!\n");
    NtDisplayString( &s );
画面にテキストを表示する部分です。

    LARGE_INTEGER li;
    li.QuadPart = -(10 * 10000000); // wait for relative 10 sec
    NtDelayExecution( FALSE, &li );
10秒間待機する部分です。 li.QuadPartに指定する値は100ns単位で、負の値だと呼び出し時点からの相対時間を意味します。

注:大きな値を与えると、長時間PCが立ち上がらないことになりますので注意してください。


前述の通り、エクスプローラなどからは実行できないので、PC起動時に実行されるプログラムとして登録します。それには以下の手順で行ってください。

1. ビルドしたntdisplay.exeを %systemroot% (例えばC:\Windows)にコピーします。

2.レジストリエディタで以下のレジストリ値を編集します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
BootExecute (REG_MULTI_SZ)


rg.png
上図の様に実行ファイル名である"ntdisplay"を追加します。
通常、"autocheck autochk *"が記述されていると思いますが、その次の行に追加するとよいでしょう。

3.[OK]を選択して値を保存し、レジストリエディタを終了して、PCを再起動します。

PC起動時にテキストで"Hello World!"と表示されたでしょうか?

今回はサンプルプログラムですので意味のある処理はしていませんが、実際にはchkdskの様なタスクを実行します。私のサイトでも、このプログラムと同じくPC起動時にファイルのコピーをするプログラムを公開していますので、興味のある方は参照してみてください。

FSNtCopy

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。