システム プラグインとnetapi32
ライブラリを介して Windows から情報を取得しようとしています。
NetWkstaGetInfo()
として適切な構造体を割り当ててから呼び出すようにしていWKSTA_INFO_100
ます。
NetWkstaGetInfo()
プロトタイプは MSDN で次のように述べています。
NET_API_STATUS NetWkstaGetInfo(
_In_ LPWSTR servername,
_In_ DWORD level,
_Out_ LPBYTE *bufptr
);
WKSTA_INFO_100
ある間
typedef struct _WKSTA_INFO_100 {
DWORD wki100_platform_id;
LMSTR wki100_computername;
LMSTR wki100_langroup;
DWORD wki100_ver_major;
DWORD wki100_ver_minor;
} WKSTA_INFO_100, *PWKSTA_INFO_100, *LPWKSTA_INFO_100;
予備テストとして、構造体のメンバーをメッセージ ボックスに表示してみます。まず、構造体をダミー情報で初期化して、割り当てられたブロックのコンテンツが API 呼び出しによって置き換えられるかどうかを確認します。
しかし、これまで、最初の構造体メンバーの後にほとんど何も得られませんでした。構造体が正しく定義されていないか、構造体の配置に問題があると思います。残念ながら、System プラグインの奇妙なドキュメントに頭がおかしくなり、あまり役に立ちません。
ここに私のテストスクリプトがあります:
outfile "hello.exe"
section
System::Call /NOUNLOAD "*(*i11,t 'some',t 'thing',i22,i44)i .r0"
Dumpstate::debug
System::Call /NOUNLOAD "netapi32::NetWkstaGetInfo(i0, i100, i r0) i.r6"
Dumpstate::debug
System::Call /NOUNLOAD "*$0(*i.r1, t.r2, t.r3, i.r4, i.r5)"
Dumpstate::debug
messagebox MB_OK "Hello, to $2 $3 domain (win $1 - $4.$5) !"
System::Free $0
sectionEnd
最初に取得した値 (500) は正しいです。ただし、他のメンバーは初期値を保持します。私は何が欠けていますか?
(編集)結果の質問:
- ドキュメントとMSDNに従うと、構造体の最初のメンバーはそう
i
ではないはず*i
ですが、正しい戻り値を取得することができませんでした*
(Dumpstateプラグインは、それがアドレスとして返されることを示す傾向があります) /NOUNLOAD
プラグインのパラメータは必須ですか? いくつかの例を見つけましたが、正確な理由は見つかりませんでした。割り当てられた構造体がパラメーターなしで時期尚早に解放されるのではないかと心配しました。確認/確認していただけますか?