NtDisplayString/NtDelayExecution [CodeTips]
今回はWindows ネイティブの実行ファイルを作成します。
Win32の実行ファイルではないので、エクスプローラなどからは実行できません。後述する様にレジストリを編集してPC起動時に実行する様にします。
ソースファイル名 'ntdisplay.cpp'
作成するのがネイティブ実行ファイルなので、WDKは必須といえます。今回も使い慣れたWindows 7のWDKを使用します。
Windows Driver Kit Version 7.1.0
(もちろん、コンパイルやリンカの設定を自前で行えば、VisualStudioなどに添付された開発環境でもバイナリを生成できる筈です)
WDKでビルドする為に必要なsourcesファイルとmakefileも示しておきます。これらをソースファイルと同じディレクトリに置き、buildコマンドでビルドします。
ファイル名 'sources'
ファイル名 'makefile'
このプログラムは特に何もしません。PCを起動(再起動)すると、画面に10秒間"Hello World!"と表示して終了します。
画面にテキストを表示する部分です。
10秒間待機する部分です。 li.QuadPartに指定する値は100ns単位で、負の値だと呼び出し時点からの相対時間を意味します。
注:大きな値を与えると、長時間PCが立ち上がらないことになりますので注意してください。
前述の通り、エクスプローラなどからは実行できないので、PC起動時に実行されるプログラムとして登録します。それには以下の手順で行ってください。
1. ビルドしたntdisplay.exeを %systemroot% (例えばC:\Windows)にコピーします。
2.レジストリエディタで以下のレジストリ値を編集します。
上図の様に実行ファイル名である"ntdisplay"を追加します。
通常、"autocheck autochk *"が記述されていると思いますが、その次の行に追加するとよいでしょう。
3.[OK]を選択して値を保存し、レジストリエディタを終了して、PCを再起動します。
PC起動時にテキストで"Hello World!"と表示されたでしょうか?
今回はサンプルプログラムですので意味のある処理はしていませんが、実際にはchkdskの様なタスクを実行します。私のサイトでも、このプログラムと同じくPC起動時にファイルのコピーをするプログラムを公開していますので、興味のある方は参照してみてください。
FSNtCopy
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 ); |
注:大きな値を与えると、長時間PCが立ち上がらないことになりますので注意してください。
前述の通り、エクスプローラなどからは実行できないので、PC起動時に実行されるプログラムとして登録します。それには以下の手順で行ってください。
1. ビルドしたntdisplay.exeを %systemroot% (例えばC:\Windows)にコピーします。
2.レジストリエディタで以下のレジストリ値を編集します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager BootExecute (REG_MULTI_SZ) |
上図の様に実行ファイル名である"ntdisplay"を追加します。
通常、"autocheck autochk *"が記述されていると思いますが、その次の行に追加するとよいでしょう。
3.[OK]を選択して値を保存し、レジストリエディタを終了して、PCを再起動します。
PC起動時にテキストで"Hello World!"と表示されたでしょうか?
今回はサンプルプログラムですので意味のある処理はしていませんが、実際にはchkdskの様なタスクを実行します。私のサイトでも、このプログラムと同じくPC起動時にファイルのコピーをするプログラムを公開していますので、興味のある方は参照してみてください。
FSNtCopy
2016-08-29 21:15
nice!(0)
コメント(0)
トラックバック(0)
コメント 0