标题:turbo c for windows环境下24位真彩色图象灰度变换问题!
只看楼主
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 

typedef unsigned int XMS_HANDLE;
//-------------------------------------------------------------------
//XMS规范使用扩充内存所用的数据结构
//-------------------------------------------------------------------
typedef struct XMS
{
unsigned long length; // 需传输的数据字节数(32位)
XMS_HANDLE source_handle; // 源数据块句柄
unsigned long source_offset; // 源偏移量(32位)
XMS_HANDLE dest_handle; // 目标数据块句柄
unsigned long dest_offset; // 目标偏移量(32位)
};

int _Cdecl XMS_Test(void);
int _Cdecl XMS_Size(void);
int _Cdecl XMS_Alloc(int size);
int _Cdecl XMS_Free(XMS_HANDLE handle);
int _Cdecl XMS_Move(struct XMS *xms);
void _Cdecl Write_To_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset);
void _Cdecl Read_From_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset);
void _Cdecl ReadHzkXMS(char *Hzkname);
void _Cdecl HzkFree(void);

/////////////////////////////////////////////////////////////////////////////////////////////////
//检测XMS是否安装
/////////////////////////////////////////////////////////////////////////////////////////////////
int _Cdecl XMS_Test(void)
{
_AX = 0x4300;
__int__(0x2F);
if (_AL == 0x80)
{
_AX = 0x4310;
__int__(0x2F);
XMS_Function=(void far *)MK_FP(_ES,_BX);
return (True);
}
return (False);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//查询空闲的扩充内存空间(不包括HMA)
/////////////////////////////////////////////////////////////////////////////////////////////////
int _Cdecl XMS_Size(void)
{
_AH = 0x08;
XMS_Function();
return (_DX);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//分配扩充内存
/////////////////////////////////////////////////////////////////////////////////////////////////
int _Cdecl XMS_Alloc(int size)
{
_DX = size;
_AH = 0x09;
XMS_Function();
if(_AX == 1)
return (_DX);
return (False);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
// 重新分配扩充内存
/////////////////////////////////////////////////////////////////////////////////////////////////
char XMS_ReAlloc(XMS_HANDLE handle,int resize)
{
_AH = 0x0f;
_DX = handle;
_BX = resize;
XMS_Function();
return _AX ? 0:_BL;
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//释放指定句柄所分配的扩充内存
/////////////////////////////////////////////////////////////////////////////////////////////////
int _Cdecl XMS_Free(XMS_HANDLE handle)
{
_DX = handle;
_AH = 0x0A;
XMS_Function();
if(_AX)
return (True);
return (False);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//扩充内存和常规内存中的数据交换(移动扩充内存块)
/////////////////////////////////////////////////////////////////////////////////////////////////
int _Cdecl XMS_Move(struct XMS *xms)
{
_DS = FP_SEG(xms);
_SI = FP_OFF(xms);
_AH = 0x0B;
XMS_Function();
if (_AX)
return (True);
return (False);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//将汉字库点阵字模从常规内存缓冲区buf装载到扩充内存
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Write_To_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset)
{
xms.length = size;
xms.source_handle = 0;
xms.source_offset = FP_SEG((void far *)buf);
xms.source_offset <<= 16;
xms.source_offset += FP_OFF((void far *)buf);
xms.dest_handle = handle;
xms.dest_offset = offset;
XMS_Move(&xms);
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//从扩充内存中读取汉字点阵字模到常规内存缓冲区buf
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl Read_From_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset)
{
xms.length = size;
xms.source_handle = handle;
xms.source_offset = offset;
xms.dest_handle = 0;
xms.dest_offset = FP_SEG((void far *)buf);
xms.dest_offset <<= 16;
xms.dest_offset += FP_OFF((void far *)buf);
XMS_Move(&xms);
}

/////////////////////////////////////////////////////////////////////////////////////////////////
//汉字库HZK16点阵装载到扩充内存
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl ReadHzkXMS(char *Hzkname)
{
unsigned long hzksize;
unsigned int size;
unsigned long offset = 0;
char buf[32];
FILE *fp;

if (!XMS_Test())
{
puts("not found XMS");
exit(1);
}
if ((fp = fopen(Hzkname,"rb")) == NULL)
{
puts("Cannot Open HZK16 ...\n");
exit(1);
}
fseek(fp,0L,SEEK_END);
hzksize = ftell(fp);
fseek(fp,0L,SEEK_SET);
size = (int)(hzksize>>10) +1;
if (XMS_Size() < size)
{
puts("not enough XMS");
fclose(fp);
exit(-1);
}
if ((xms_handle = XMS_Alloc(size)) == 0)
{
puts("XMS handle Error...");
fclose(fp);
exit(-1);
}
while (!feof(fp))
{
size = fread(buf,sizeof(char),32,fp);
Write_To_XMS(buf,size,xms_handle,offset);
offset += size;
}
fclose(fp);
ROM_ASCII = Current_ASCII_ROM(S16X8);
}

/////////////////////////////////////////////////////////////////////////////////////////////////
// 释放XMS内存
/////////////////////////////////////////////////////////////////////////////////////////////////
void _Cdecl HzkFree(void)
{
XMS_Free(xms_handle);
}


多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-12-18 11:20
ba_wang_mao
Rank: 2
来 自:成都理工大学
等 级:论坛游民
帖 子:297
专家分:27
注 册:2006-11-7
得分:0 
#define False 0
#define True 1
void far (*XMS_Function)(void) = 0L;// XMS服务程序入口地址
struct XMS xms;
XMS_HANDLE xms_handle; // 伪指针

你也可以参考董凯的NEO源代码,就在本站。

多年以来还在MSDOS、单片机下搞嵌入式编程,对WINDOWS编程一窍不通,很想了解WINDOWS下病毒编程技术。
2006-12-18 11:22
lyood
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2006-6-15
得分:0 
高手!!
谢谢啊~~
学到很多知识!!

2006-12-20 21:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-109453-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.209834 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved