私はPsGetContextThreadと呼ばれる文書化されていない関数を使用してドライバからusermodeスレッドのコンテキストを取得しようとしていますが、これはusermodeから可能ですが、私はこれをカーネルから行う理由がありますこれは交渉可能なものではありませんので、そちらに進んでください。今話題に戻って、デバッグ時のコードには有効なスレッドが含まれていて、すべてがうまく見えますが、ACCESS_VIOLATIONのエラーコードC0000005が返されますが、このコードがどのようにトリガできるのか分かりません。これは私がかなり長い間このことに固執していたからです。PsGetContextThread C0000005(ACCESS_VIOLATION)を返す
NTSTATUS GetThreadContext(PETHREAD thread) {
KPROCESSOR_MODE mode = UserMode;
CONTEXT context;
UNICODE_STRING setContextString, getContextString;
pPsGetContextThread PsGetContextThread;
NTSTATUS status = STATUS_SUCCESS;
RtlInitUnicodeString(&getContextString, L"PsGetContextThread");
RtlZeroMemory(&context, sizeof(CONTEXT));
PsGetContextThread = (pPsGetContextThread)MmGetSystemRoutineAddress(&getContextString);
context.ContextFlags = CONTEXT_FULL;
status = PsGetContextThread(thread, &context, mode);
if (!NT_SUCCESS(status)) {
return STATUS_UNSUCCESSFUL;
}
return STATUS_SUCCESS;
}
誰かが次に試してみたいことが分かっていたり、下記の投稿をしてください。
**あなたは** ** kernel **モードから** user **モードから呼び出されることになっている**文書化されていない**関数を使用します。なぜそれがうまくいかないのだろうか?何か気付く? – Olaf
@Olafあなたは間違っていますが、PsGetContextThreadはusermodeから呼び出されることは想定されていません...カーネルのエクスポートの一部であり、ドライバによって呼び出すことができます。関数へのポインタが有効であり、ACCESS_VIOLATIONをステータス変数 – Paze
に返す呼び出し自体がカーネルモードのアドレス '&context'を渡しているのに' UserMode'を指定していると思われます。 'UserMode'が指定されたとき、' PsGetContextThread'が最初に行うのは '&context'が有効なユーザモードポインタであることをチェックすることです。代わりに 'KernelMode'を指定してみてください。 –