解决方案 »

  1.   

    X64中VC是不支持内嵌汇编的.
    但是Delphi还是支持的,但是和之前有点区别.就是如果内嵌汇编就要整个函数都用会编写.比如:
    procedure test;
    asm
    .......
    end;
      

  2.   

    另外你这个Hook其实不需要内嵌汇编.
    http://www.raysoftware.cn/?p=493
    支持X86,X64的各种Hook,.而且使用很简单
      

  3.   

      asm
        push  OutputBufferLength      //XE4 64位编译这里报错,需要另外写一个方法,不知道怎么写
        push  OutputBuffer
        push  InputBufferLength
        push  InputBuffer
        push  IoControlCode
        push  IoStatusBlock
        push  ApcContext
        push  ApcRoutine
        push  Event
        push  FileHandle
        call  OldNtDeviceIoControl
        mov   Result, eax
      end;这就是一个标准的API调用,可以不使用汇编的,先定义这个函数的格式,把OldNtDeviceIoControl强转类型到函数类型,即可调用
      

  4.   

    type
      TNtDeviceIoControlFileFun = function(
            FileHandle: THANDLE;
            Event: THANDLE;
            ApcRoutine: PIO_APC_ROUTINE;
            ApcContext: PVOID;
            IoStatusBlock: PIO_STATUS_BLOCK;
            IoControlCode: ULONG;
            InputBuffer: PVOID;
            InputBufferLength: ULONG;
            OutputBuffer: PVOID;
            OutputBufferLength: ULONG
            ): NTSTATUS; stdcall;
    function NewNtDeviceIoControlFile(
      FileHandle: THANDLE;
      Event: THANDLE;
      ApcRoutine: PIO_APC_ROUTINE;
      ApcContext: PVOID;
      IoStatusBlock: PIO_STATUS_BLOCK;
      IoControlCode: ULONG;
      InputBuffer: PVOID;
      InputBufferLength: ULONG;
      OutputBuffer: PVOID;
      OutputBufferLength: ULONG
      ): NTSTATUS; stdcall;
    var
      AfdInfo: PAFD_INFO;
      Buffer: PAnsiChar;
      Len: DWORD;
      tmpStr: string;
      Index: Integer;
    begin
      // 先调用原始函数
      Result := TNtDeviceIoControlFileFun(OldNtDeviceIoControl)(
                   FileHandle,
                   Event,
                   ApcRoutine,
                   ApcContext,
                   IoStatusBlock,
                   IoControlCode,
                   InputBuffer,
                   InputBufferLength,
                   OutputBuffer,
                   OutputBufferLength);
     
      // 如果原始函数失败了(例如RECV无数据)
      if (not NT_SUCCESS(Result)) then
      begin
        Exit;
      end;
    ....另:别被3楼的话吓到了,32位和64位可以用编译关键字区分的
    如:
    function Test : Boolean;
    {$IFDEF CPUARM}
    begin
      //Android,iOS等ARM编码写于此
      Result := False;
    end;
    {$ELSE}
    asm
    {$IFDEF CPUX64}
      XOR  RAX , RAX
    {$ELSE}  //CPUX86
      XOR  EAX , EAX
    {$ENDIF}
    end;
    {$ENDIF}