HINSTANCE ntdll=NULL;
ntdll=::LoadLibrary(TEXT("ntdll.dll"));
HANDLE  ( *ntadress)(DWORD dwDesiredAccess,BOOL bInheritHandle, DWORD dwProcessId);
if(ntdll!=NULL)
{
ntadress = (HANDLE  (*)(DWORD dwDesiredAccess,BOOL bInheritHandle, DWORD dwProcessId))GetProcAddress(ntdll,"NtOpenProcess");
}
HANDLE pro = (*ntadress)(PROCESS_ALL_ACCESS,false,id);
运行时出了问题
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
应该是堆栈被破坏,查了下是调用约定的问题,这种dll中的api应该用哪种约定。

解决方案 »

  1.   

    肯定要加上_stdcall调用约定,API都是这样的调用约定
      

  2.   

    不行啊,加上stcall还是这个错误
      

  3.   

    参数怎么不对,你是说id吗,那个是前面得到的pid的值。
      

  4.   


    HANDLE  ( *ntadress)(DWORD dwDesiredAccess,BOOL bInheritHandle, DWORD dwProcessId);
    这个是OpenProcessNtOpenProcess是下面这个
    NTSYSAPI 
    NTSTATUS
    NTAPI
    NtOpenProcess(
      OUT PHANDLE             ProcessHandle,
      IN ACCESS_MASK          AccessMask,
      IN POBJECT_ATTRIBUTES   ObjectAttributes,
      IN PCLIENT_ID           ClientId );