//内存块移动参数表
typedef struct _tagXMSMOVEPARAMETERBLOCK
{
DWORD dwCount;//移动的字节数,必须是偶数
HANDLE hSource;//源块的名柄号,为0时,源块地址由下面两个给出
WORD wSourceOffset;//源块名柄号为0时,源内存块的偏移地址
WORD wSourceSeg;//源块名柄号为0时,源内存块的段地址
HANDLE hTarget;//目的块名柄号,为0时,目的块地址由下面两个给出
WORD wTargetOffset;//目的块名柄号为0时,目的内存块的偏移地址
WORD wTargetSeg;//目的块名柄号为0时,目的内存块的段地址
}XMSMOVEPARAMETERBLOCK;
//读XMS内存部份内容,字节数必须为偶数,否则须改动该函数
BOOL ReadXms(WORD hBlock, DWORD dwIndex, void* pBuffer, DWROD dwCount)
{
void* pStr = pBuffer;
DWORD dwNewCount = dwCount;
DWORD dwNewIndex = dwIndex;
void* pVector = g_pIntVector;
if ((dwCount % 2) != 0) //对奇字节进行处理
{
//这里略去实现部份
//......
}
XMSMOVEPARAMETERBLOCK mXmsMoveParameterBlock;
mXmsMoveParameterBlock.dwCount = dwNewCount;
mXmsMoveParameterBlock.hSource = hBlock;
mXmsMoveParameterBlock.wSourceOffset = LOWORD(dwNewIndex);
mXmsMoveParameterBlock.wSourceSeg = HIWORD(dwNewIndex);
mXmsMoveParameterBlock.hTarget = NULL;
mXmsMoveParameterBlock.wTargetOffset = FP_OFF(pStr);
mXmsMoveParameterBlock.wTargetSeg = FP_SEG(pStr);
WORD wOffset = FP_OFF(&mXmsMoveParameterBlock);
WORD wSegment = FP_SEG(&mXmsMoveParameterBlock);
asm push si
asm push ds
asm mov ah, 0BH
asm mov si, wOffset
asm mov ds, wSegment
asm call [pVector]
asm mov bResult, ax
asm pop ds
asm pop si
return ((bResult) ? TRUE : FALSE);
}