我想使用 Windows NTAPI 启动一个进程,但它一直出错,错误代码为 c0000033

I Want to start a process using the Windows NTAPI, but it keeps erroring with error code c0000033

提问人:zvqle 提问时间:11/3/2023 更新时间:11/3/2023 访问量:90

问:

我想学习适用于 Windows 的本机 API,所以我决定使用它创建一个进程,它编译没有问题,但是当我运行它时,它给了我一个错误代码 c0000033,检查后,它说这意味着它找不到文件。但文件在目录中

这是项目的代码

#include <Windows.h>
#include <winternl.h>
#include <tchar.h>
#include <stdio.h>




typedef NTSTATUS(NTAPI *PNtCreateProcess)(
    _Out_ PHANDLE ProcessHandle,
    _In_ ACCESS_MASK DesiredAccess,
    _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
    _In_ HANDLE ParentProcess,
    _In_ BOOLEAN InheritObjectTable,
    _In_opt_ HANDLE SectionHandle,
    _In_opt_ HANDLE DebugPort,
    _In_opt_ HANDLE TokenHandle
);





int main() {
    HMODULE ntdll = GetModuleHandleW(L"ntdll.dll");
    if(!ntdll){
        wprintf(L"Failed Getting Handle!\n");
        return 0;
    }
    PNtCreateProcess NtCreateProcess = (PNtCreateProcess)GetProcAddress(ntdll, "NtCreateProcess");
    if(!NtCreateProcess){
        wprintf(L"Failed Getting Function From NTDLL!\n");
        return 0;
    }
    
    UNICODE_STRING applicationPath;
    RtlInitUnicodeString(&applicationPath, L"C:\\WINDOWS\\NOTEPAD.EXE");
    for (int i = 0; i < applicationPath.Length / sizeof(WCHAR); i++) {
        wprintf(L"%c", applicationPath.Buffer[i]);
    }
    wprintf(L"\n");
    OBJECT_ATTRIBUTES objectAt;
    InitializeObjectAttributes(&objectAt, &applicationPath, OBJ_CASE_INSENSITIVE, NULL, NULL);

    CLIENT_ID clientId;
    PROCESS_BASIC_INFORMATION pbi;
    NTSTATUS status = NtCreateProcess(&clientId.UniqueProcess, PROCESS_ALL_ACCESS, &objectAt, GetCurrentProcess(), FALSE, NULL, NULL, NULL);
    if (NT_ERROR(status))
        wprintf(L"Error Creating Process!: %x\n", status);
        return
    status = NtQueryInformationProcess(clientId.UniqueProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL);
    if(NT_ERROR(status)){
        wprintf(L"failed creating process\n");
        return 0;
    }

    return 0;
c winapi nt-本机-api

评论

1赞 Some programmer dude 11/3/2023
该代码应导致构建错误,因为您有一个无条件的纯语句,没有终止 .请确保将适当的最小可重复示例复制粘贴到您的问题中。return;
1赞 Remy Lebeau 11/3/2023
@Someprogrammerdude“你有一个无条件的纯 return 语句,没有终止符 ;” - 以及缺少大括号。return
1赞 Remy Lebeau 11/3/2023
@zvqle“它编译时没有问题,没有警告”——你应该已经收到关于无法访问代码的警告。 上缺少 ,因此 only 仅适用于 和 始终无条件执行,返回表达式分配给的任何值,从而跳过所有后续代码。if (NT_ERROR(status)) wprintf(L"Error Creating Process!: %x\n", status); return{}ififwprintf()returnstatus = NtQueryInformationProcess(...)status
2赞 Ben Voigt 11/3/2023
@Someprogrammerdude:我确信 很乐意返回表达式生成的值returnstatus = NtQueryInformationProcess(...)
2赞 RbMm 11/3/2023
"C:\\WINDOWS\\NOTEPAD.EXE" ==> STATUS_OBJECT_NAME_INVALID

答: 暂无答案