CreatFile win32呼び出し(私の場合はCreateFileW)とその戻り値をダンプするためのピンツールを作成しました。次のようになります。
/* ... */
VOID Image(IMG img, VOID *v)
{
RTN cfwRtn = RTN_FindByName(img, "CreateFileW");
if (RTN_Valid(cfwRtn))
{
RTN_Open(cfwRtn);
RTN_InsertCall(cfwRtn, IPOINT_BEFORE, (AFUNPTR)CreateFileWArg,
IARG_ADDRINT, "CreateFileW",
IARG_FUNCARG_ENTRYPOINT_VALUE, 0,
IARG_END);
RTN_InsertCall(cfwRtn, IPOINT_AFTER, (AFUNPTR)CreateFileWafter,
IARG_FUNCRET_EXITPOINT_VALUE, IARG_END);
RTN_Close(cfwRtn);
}
}
/* ... */
VOID CreateFileWArg(CHAR * name, wchar_t * filename)
{
TraceFile << name << "(" << filename << ")" << endl;
}
VOID CreateFileWafter(ADDRINT ret)
{
TraceFile << "\tReturned handle: " << ret << endl;
}
それは興味深い結果をもたらします。たとえば、既存のファイルを開くだけで他に何もしない小さなプログラムでは、次のようになります。
CreateFileW(file.txt)
Returned handle: 0
CreateFileW(file.txt)
Returned handle: 0x74
Returned handle: 0x74
たくさんの異常。1.)実際に2つの呼び出しがあるのはなぜですか?2.)私が間違っていなければ、CreateFileは決して0を返さないはずです。3。)2回目の呼び出しの後、2回(?)を返します。
また、 CreateFileWを1回直接呼び出す単純なc ++プログラムをインストルメント化しようとしましたが、その結果は次のようになります。
CreateFileW(file.txt)
Returned handle: 0
CreateFileW(file.txt)
Returned handle: 0xffffffff
Returned handle: 0xffffffff
開こうとしたファイルが存在しなかったので、戻り値(-1 == INVALID_HANDLE_VALUE)は少なくとも正しいです。
何か案は?前もって感謝します!