⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dosmem.h

📁 Test some scsi command for usb mass storage
💻 H
字号:
/**********************************
 * Dos(Real Mode) Memory Class
 **********************************/
class DOS_MEM {
  protected:
    DWORD address;
    DWORD length;
    int selector;

  public:
    DOS_MEM(DWORD length_in_bytes) {
      AllocateMem(length_in_bytes);
    }
    ~DOS_MEM(void) {
      if (length != 0)
        __dpmi_free_dos_memory(selector);
    }
    void AllocateMem(DWORD length_in_bytes) {
      int vbe_info;

      length = (length_in_bytes + 15) & 0xFFFF0;   // Round to nearest 16 bytes
      if ((vbe_info = __dpmi_allocate_dos_memory(length/16, &selector)) == -1) {
        printf( "ERROR allocating DOS memory\n" );
        exit(10);
      }

      address = ((vbe_info << 4) & 0xffff0) + ((vbe_info >> 16) & 0xffff);
    }
    int GetOffset(void) {
      return address & 0xF;
    }
    int GetSegment(void) {
      return (address >> 4);
    }
    DWORD GetAddress(void) {
      return address;
    }
    DWORD GetLength(void) {     // Return The Length of memory
      return length;
    }
    DWORD GetDWORD(DWORD offset) {
      return _farpeekl(selector, offset);
    }
    WORD GetWORD(DWORD offset) {
      return _farpeekw(selector, offset);
    }
    BYTE GetBYTE(DWORD offset) {
      return _farpeekb(selector, offset);
    }
    void SetDWORD(DWORD value, DWORD offset) {
      _farpokel(selector, offset, value);
    }
    void SetWORD(WORD value, DWORD offset) {
      _farpokew(selector, offset, value);
    }
    void SetBYTE(BYTE value, DWORD offset) {
      _farpokeb(selector, offset, value);
    }
    /******************************************************************
     * Copy data into DOS memory at offset for length from addr
     * addr   - address of memory to copy from.
     * offset - Where to begin within virtual memory (in bytes).
     * length - Number of bytes to Copy (in bytes).
     ******************************************************************/
    void CopyFrom(DWORD addr, DWORD length_in_bytes, DWORD offset) {
      int i;

      if (offset < 0) offset = 0;

      if (length_in_bytes < 0 ||
          length_in_bytes > length ||
          offset + length_in_bytes > length)
        length_in_bytes = length - offset;

      if (length_in_bytes > 0)
        movedata(_my_ds(), (unsigned)addr, selector, (unsigned)offset, length_in_bytes);
    }
    /**********************************************************************
     * Copy data from DOS memory at offset for length into addr
     * addr - address of memory to copy into.
     * offset - Where to begin within virtual memory (in bytes).
     * length - Number of bytes to Copy (in bytes).
     *********************************************************************/
    void CopyTo(DWORD addr, DWORD length_in_bytes, DWORD offset) {
      int i;

      if (offset < 0) offset = 0;

      if (length_in_bytes < 0 ||
          length_in_bytes > length ||
          offset + length_in_bytes > length)
        length_in_bytes = length - offset;

      if (length_in_bytes > 0)
        movedata(selector, (unsigned)offset, _my_ds(), (unsigned)addr, length_in_bytes);
    }
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -