THUNK到WIN16,调用INT13.事先需要获取排他硬盘访问.

解决方案 »

  1.   


    //用VWIN32接口调用DOS功能25/26(Windows 95)或7305/7306(Windows OSR2及以上)
    //如果想直接读写硬盘绝对扇区,由于VWIN32的VWIN32_DIOC_DOS_INT13接口存在Bugs,
    //只有写一个IO子系统Driver,或者Thunk到Win16,然后直接调用INT13。    
    #define VWIN32_DIOC_DOS_INT25 2
    #define VWIN32_DIOC_DOS_INT26 3
    #define VWIN32_DIOC_DOS_IOCTL 1#define FAILUE_LOAD_VWIN32 1
    #define FAILUE_LOCK_DRIVE 2
    #define FAILUE_CALLING 3
    #define FAILUE_DIOC             4
    #define FAILUE_LOAD_EXT_DIOC 5#ifndef QWORD
    #define QWORD ULONGLONG
    #endiftypedef struct DIOC_REGISTERS {
    DWORD ebx;
    DWORD edx;
    DWORD ecx;
    DWORD eax;
    DWORD edi;
    DWORD esi;
    DWORD eflags;
    } DIOC_REGISTERS, *PDIOC_REGISTERS;typedef struct DISKIOADDR{  
        DWORD StartSector;   //dd  ?   ;sector number to start
        WORD Sectors;       //dw  ?   ;number of sectors
        DWORD Buffer;        //dd  ?   ;address of buffer
    }DISKIOADDR;int ExecIoCommand(  WORD dCode,  DIOC_REGISTERS *reg )
    {
    HANDLE hVxd;
    BOOL fResult;
    DWORD   cb; SetLastError(0); hVxd = CreateFile( "\\\\.\\vwin32", 0, 0, 
    NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL ); if( GetLastError() == ERROR_FILE_NOT_FOUND ) 
    return FAILUE_LOAD_VWIN32;


    fResult = ::DeviceIoControl( hVxd, 
    dCode,
    reg, sizeof( DIOC_REGISTERS ),
    reg, sizeof( DIOC_REGISTERS ),
    &cb, 0 ); if( !fResult ) {
    cb = GetLastError();
    #ifdef _DEBUG
    wvsprintf( (char *)error, "Error code: %u", (char *)&cb );
    ::MessageBox( NULL, error, "error", MB_OK );
    #endif
    fResult = FAILUE_DIOC;
    }
    else if( reg->eflags & 1 ) fResult = FAILUE_CALLING;
    else fResult = 0;

    CloseHandle( hVxd );
    return( fResult );
    }
    //用VWIN32的Int25/Int26接口(不支持FAT32,仅适用于Windows95)
    int  AbsLogRead95(char drv, char *buf, int StartSectors, int Num )
    {
       DIOC_REGISTERS r;  //int 25 for read   r.eax = drv-1;
       r.ebx = (unsigned)buf;
       r.ecx = Num;
       r.edx = StartSectors;
       return (ExecIoCommand( VWIN32_DIOC_DOS_INT25, &r ) );
    }//用VWIN32调用DOS的0x7305功能(支持FAT32,仅适用于Windows OSR 2及以上版本)
    int  AbsLogRead97(char drv, char *buf, int StartSectors, int Num)
    {
    int  ErrorCode;
    DIOC_REGISTERS  reg;
    DISKIOADDR addr;
    *( DWORD *)( ( BYTE * )&addr     )  = StartSectors;             //sector start
    *(  WORD *)( ( BYTE * )&addr + 4 )  = Num;                     //sector number
    *( DWORD *)( ( BYTE * )&addr + 6 )  = (unsigned)buf; //buf size
    reg.eax = 0x7305;
    reg.ebx = (unsigned)&addr;
    reg.ecx = -1;
    reg.edx = drv;
    reg.esi = 0;
    ErrorCode = ExecIoCommand( 6, &reg );
    return ErrorCode;
    }
      

  2.   

    如何做“只有写一个IO子系统Driver,或者Thunk到Win16,然后直接调用INT13”?有源程序吗?