0

私はこのコードを持っています:

// page1.h

NTSTATUS (__stdcall *NtFsControlFile)( 
                    HANDLE FileHandle,
                    HANDLE Event,                   
                    PIO_APC_ROUTINE ApcRoutine,     
                    PVOID ApcContext,               
                    PIO_STATUS_BLOCK IoStatusBlock, 
                    ULONG FsControlCode,
                    PVOID InputBuffer,              
                    ULONG InputBufferLength,
                    PVOID OutputBuffer,     
                    ULONG OutputBufferLength
            );


ULONG (__stdcall *RtlNtStatusToDosError) (
        IN NTSTATUS Status
        );

次に、page2.cppで:

page2.cpp
VOID LocateNativeEntryPoints()
{
    //
    // If we're on Win9x, just return
    //
    if( GetVersion() >= 0x80000000) return;

    //
    // Load the NTDLL entry point we need
    //
    if( !(NtFsControlFile = (void *) GetProcAddress( GetModuleHandle(TEXT("ntdll.dll")),
            "NtFsControlFile" )) ) {

        _tprintf(TEXT("\nCould not find NtFsControlFile entry point in NTDLL.DLL\n"));
        exit(1);
    }
    if( !(RtlNtStatusToDosError = (void *) GetProcAddress( GetModuleHandle(TEXT("ntdll.dll")),
                            "RtlNtStatusToDosError" )) ) {

        _tprintf(TEXT("\nCould not find RtlNtStatusToDosError entry point in NTDLL.DLL\n"));
        exit(1);
    }
}

にこれらのエラーがありますif(!NtFsControlFile = and if( !(RtlNtStatusToDosError =

error C2440: '=' : cannot convert from 'void *' to 'NTSTATUS (__stdcall *)(HANDLE,HANDLE,PIO_APC_ROUTINE,PVOID,PIO_STATUS_BLOCK,ULONG,PVOID,ULONG,PVOID,ULONG)'
         Conversion from 'void*' to pointer to non-'void' requires an explicit cast

error C2440: '=' : cannot convert from 'void *' to 'ULONG (__stdcall *)(NTSTATUS)'
         Conversion from 'void*' to pointer to non-'void' requires an explicit cast

元のpage2は C 言語ファイルでした。それをキャストする必要があり、それを行う方法、または問題を解決するにはどうすればよいですか。

どうもありがとう。

動作するように見えるソリューション(C言語のように自動的にキャストされません):

     // a typedef to make casting easier

    typedef NTSTATUS (__stdcall *NtFsControlFilePtr)(
        HANDLE FileHandle,
        HANDLE Event,
        PIO_APC_ROUTINE ApcRoutine,
        PVOID ApcContext,
        PIO_STATUS_BLOCK IoStatusBlock,
        ULONG FsControlCode,
        PVOID InputBuffer,
        ULONG InputBufferLength,
        PVOID OutputBuffer,
        ULONG OutputBufferLength);

// the actual pointer to function

NtFsControlFilePtr NtFsControlFile;

// and the GetProcAddress call

    if( !(NtFsControlFile = reinterpret_cast<NtFsControlFilePtr>( GetProcAddress( GetModuleHandle(TEXT("ntdll.dll")),
            "NtFsControlFile" ))) ) {

        _tprintf(TEXT("\nCould not find NtFsControlFile entry point in NTDLL.DLL\n"));
        exit(1);
    }

このソリューションは機能しますが、次のことが得られます。

C4191: 'reinterpret_cast': 安全でない変換

/WALL付き

警告を回避するには:

if( !(NtFsControlFile = reinterpret_cast<NtFsControlFilePtr>( reinterpret_cast< void* >( GetProcAddress( GetModuleHandle(TEXT("ntdll.dll")), 
        "NtFsControlFile" )))))  {

        _tprintf(TEXT("\nCould not find NtFsControlFile entry point in NTDLL.DLL\n"));
        exit(1);
    }

   if( !(RtlNtStatusToDosError = reinterpret_cast<RtlNtStatusToDosErrorPtr>( reinterpret_cast< void* >( GetProcAddress( GetModuleHandle(TEXT("ntdll.dll")), 
        "NtFsControlFile" )))))  {

        _tprintf(TEXT("\nCould not find NtFsControlFile entry point in NTDLL.DLL\n"));
        exit(1);
    }
4

1 に答える 1

0

純粋な C コードがある場合は、型キャストを少し変更できます。つまり、次のようになります。

  1. 変数を宣言します。

    typedef NTSTATUS (__stdcall *NT_FS_CONTROL_FILE)(IN HANDLE FileHandle,
                          IN  HANDLE Event, IN PIO_APC_ROUTINE  ApcRoutine,
                          IN PVOID ApcContext, OUT PIO_STATUS_BLOCKIoStatusBlock,
                          IN ULONG FsControlCode, IN PVOID InputBuffer,
                          IN ULONG InputBufferLength, OUT  PVOID OutputBuffer,
                          IN ULONG OutputBufferLength);
    NT_FS_CONTROL_FILE nt_fs_control_file;
    

    次に、必要があります

    nt_fs_control_file = GetProcAddress(
    

    また

    nt_fs_control_file = (NT_FS_CONTROL_FILE)GetProcAddress
    
  2. 関数を呼び出すには:

    NTSTATUS status = nt_fs_control_file(....);
    
于 2015-06-01T12:54:18.387 に答える