在9x下直接访问硬盘
在Windows9X中,由于内存和进程的保护,直接使用INT将会引起GPFs。在很多资料上都说要在windows中直接读写硬盘的方法只有使用VxD。这并不是真的,事实上使用windows9x公开的API就可以直接对硬盘进行操作。在microsoft programmer's guide to win95中,关于Device I/O Control中就有说明如何使用VWIN32呼叫MSDOS系统服务(磁盘访问类)。定义了一下5个控制码:
VWIN32_DIOC_DOS_DRIVEINFO (6) INT 21h AX=730Xh,win95 osr2与以后版本提供的FAT32文件系统的访问
VWIN32_DIOC_DOS_INT13 (4) BIOS INT13h
VWIN32_DIOC_DOS_INT25 (2) DOS INT25h
VWIN32_DIOC_DOS_INT26 (3) DOS INT26h
VWIN32_DIOC_DOS_IOCTL (1) DOS设备I/O,(int 21h,ax=4400h到4411h)
使用方法如下:
使用
CreateFile("\\\\.\\vwin32",0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
打开vwin32.vxd
根据调用的功能所用到的寄存器填充以下结构体:
typedef struct _DIOC_REGISTERS {
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;
使用
DeviceIoControl(hDevice,CONTROL_CODE,®,sizeof(reg),®,sizeof(reg),
&dwBytesReturn,0);
调用MS-DOS的磁盘访问功能。
最后调用 CloseHandle(hDevice);
确定硬盘空间
在安装一些软件时,我们会看来一些安装程序会对你说你选的硬盘空间不够,这种确定硬盘空间的程序是如何做到的呢?
GetDiskFreeSpace是一个返回一个磁盘大小、划分、可用空间等信息的函数,我们可以用它来达到目的。
DWORD sectorspercluster ;
DWORD bytespersector ;
DWORD clusters ;
DWORD freeclusters ;
GetDiskFreeSpace (path.c_str (),§orspercluster,&bytespersector,&freeclusters,&clusters);
确定系统还有多少内存
大家都会想看看自己的内存还有多少,在一些工具中我们可以看到,如果我们自己来做要做些什么才能实现呢?
WINDOWS的API函数GlobalMemoryStatus是用来得到当前内存情况的,如果我们想实时看到内存的变化情况就要配合TIMER来完成了。我们是把提取每次内存情况和显示做成一个函数,只要在TIMER中设定一个你想要的调用周期,就可以达到目的了。下面是一个系统信息程序的一段,也就是关于内存的部分。
void TForm1::UpdateUsage ()
{
MEMORYSTATUS memory ;
memory.dwLength = sizeof (memory) ;
GlobalMemoryStatus (&memory) ;
ProgressBar1->Position = (float) memory.dwMemoryLoad ;
// Physical Memory Usage
ProgressBar2->Position = 100.0 * (memory.dwTotalPhys - memory.dwAvailPhys) /
(float) memory.dwTotalPhys ;
Label7->Caption = String ((int) (memory.dwTotalPhys / 1024)) + " K Total" ;
Label8->Caption = String ((int) (memory.dwAvailPhys / 1024))
+ " K Free" ;
// Virtual Memory Usage
ProgressBar3->Position =
100.0 * (memory.dwTotalVirtual - memory.dwAvailVirtual) /
(float) memory.dwTotalVirtual ;
Label9->Caption = String ((int) (memory.dwTotalVirtual / 1048576.0))
+ " MB Total" ;
Label10->Caption = String ((int) (memory.dwAvailVirtual / 1048576.0))
+ " MB Free" ;
// Page File Usage
ProgressBar4->Position =
100.0 * (memory.dwTotalPageFile - memory.dwAvailPageFile) /
(float) memory.dwTotalPageFile ;
Label11->Caption = String ((int) (memory.dwTotalPageFile / 1048576.0))
+ " MB Total" ;
Label12->Caption = String ((int) (memory.dwAvailPageFile / 1048576.0))
+ " MB Free" ;
}