Ò».ʲôÊÇVxD?
¡¡¡¡´Ó¶àÈÎÎñ²Ù×÷ϵͳWindows 3.1Æð,¼ÆËã»úÖеÄÈÎÒ»ÎïÀíÉ豸x¿Éͬʱ±»»ùÓÚDos»òWindowsµÄ¶à¸ö½ø³ÌʹÓÃ,ÕâÖÖÒ»¶Ô¶àµÄ¹Øϵ³ÆΪ"É豸ÐéÄ⻯",¸÷½ø³Ìͨ¹ýÔËÐÐÔÚºËÐIJãµÄVxD£¨ÐéÄâxÉ豸Çý¶¯³ÌÐò£©´æÈ¡ÎïÀíÉ豸x.²Ù×÷ϵͳÌṩ¸øÓû§µÄÈí¼þ·þÎñÒ²¿ÉÒÔÓÃVxDʵÏÖ.¼ÆËã»úÖеÄÆäËü×ÊÔ´,ÈçCPU,ÄÚ´æµÈÒ²¿Éͬʱ±»¶à¸ö½ø³ÌʹÓÃ,¸÷½ø³ÌÔÚϵͳÌṩµÄÐéÄâ»ú£¨VM£©»·¾³Ï´æÈ¡ÕâÀà×ÊÔ´.
¡¡¡¡VxD¿ÉÓÉÐéÄâ»ú¹ÜÀíÆ÷£¨VMM£©ÔÚ¿ª»úʱװÈëºËÐIJ㣨³Æ¾²Ì¬×°Èë,¼´ÖÃVxDÓÚc:\windows\systemĿ¼ÏÂ,ÔÚc:\windows\system.iniÎļþÖÐ,¶Ô½Ú[386Enh]¼ÓÒ»ÐÐ"device=´ËVxDÎļþÃû"£©,»òÓÉÓ¦ÓóÌÐòʵʱװÈ루³Æ¶¯Ì¬×°È룩,¶øºó,¸÷½ø³Ì±ã¿É´æÈ¡Ëø¶¨ÔÚÄÚ´æÖеÄVxDÊý¾ÝÇø,ÒÔʵʱ¿ØÖÆVxDµÄÐÐΪ,VxDµÄÄÚ²¿½á¹¹¿É·ÀÖ¹Á½¸ö½ø³Ìͬʱ´æÈ¡ÆäÊý¾ÝÇø.VxDͨ¹ýÏìÓ¦VMM·¢¸øËüµÄʼþÓëÍâ½ç½»»¥.
¡¡¡¡Windows 95ÖÐ,»ùÓÚDosµÄÿ¸ö½ø³ÌÔÚµ¥¶ÀµÄVMÖÐÔËÐУ¨³ÆÔÚV86ģʽÏÂÔËÐУ©,¼È¿É°´Dosµ¥½ø³Ì·½Ê½,ÔÚ640kµÍÄÚ´æÖÐÔËÐУ¨³ÆÔÚʵģʽÏÂÔËÐУ©,ÓÖ¿ÉÀûÓöà½ø³Ì»·¾³µÄÓŵã,ÔÚÕû¸öÄÚ´æÖÐÔËÐУ¨³ÆÔÚ±£»¤Ä£Ê½ÏÂÔËÐУ©,ÒÔͨ¹ý95µÄDPMI½Ó¿Ú´æÈ¡ÄÚ´æ¸ß¶ËµÄWindowsͼÐλ·¾³.ÆäËü16λ»ò32λӦÓóÌÐò¾ùÔÚͬһϵͳVMÖÐÔËÐÐ.
¡¡¡¡ÏÂÃæÖ»ÌÖÂÛ95»·¾³ÏµÄVxD.
¡¡¡¡¶þ. VxDµÄ´´½¨:
¡¡¡¡1. ÓÉ»ã±àÓïÑÔ´´½¨VxD:Ð谲װ΢Èí¹«Ë¾µÄWin32 SDK¼°DDK.
¡¡¡¡2. ÓÉC»òC++ÓïÑÔ´´½¨VxD:Ðè°²×°VC2.0»òBC4.0,¼°Vireo Software¹«Ë¾µÄVToolsDÈí¼þ°ü.VToolsDº¬3¸öʵÓù¤¾ß:¿É´´½¨VxD¿ò¼ÜµÄQuickVxD;¿É¶¯Ì¬×°Ð¶VxDµÄVxD Loader;¿ÉÏÔʾÄÚ´æVxDÌØÐÔµÄVxD Viewer;
¡¡¡¡QuickVxDº¬7¸ö¶Ô»°Ò³:
¡¡¡¡£¨1£© Device ParametersÒ³°üÀ¨:×î¶à8¸ö×Ö·ûµÄVxDÃû,Ψһ±êʶºÅ£¨ID£©,Ïà¶ÔÆäËüVxDµÄ×°Èë˳Ðò£¨VxD Viewer¿ÉÏÔ³öijVxDµÄ×°Èë˳ÐòÖµInit Order,ÈôÖ¸¶¨ÐÂVxDµÄ×°Èë˳ÐòСÓÚ´ËInit Order,ÔòÐÂVxD½«ÔÚ´ËVxDÇ°±»×°È룩,ʵÏÖÓïÑÔ£¨C»òC++£©,¾²¡¢¶¯Ì¬×°È뷽ʽµÈ.
¡¡¡¡£¨2£© VxD ServicesÒ³°üÀ¨:¿É±»ÆäËüVxD·ÃÎʵĽӿڣ¨³ÆΪVxD·þÎñ£©,ÒªÇó±¾VxDµÄID>0,ÇÒδÓëÄÚ´æ¸÷VxDµÄIDÖµ³åÍ». ´ËID¿ÉÏò΢Èí¹«Ë¾ÉêÇë,Ò²¿ÉʹÓÃVireo¹«Ë¾µÄVIREO_TEST_ID£¨3180h£©.ϳƴËÀàIDΪ½Ó¿ÚID.
¡¡¡¡£¨3£© APIÒ³°üÀ¨:¿É±»Ó¦ÓóÌÐòÔÚʵģʽ/V86ģʽÏ¡¢±£»¤Ä£Ê½Ï¡¢DPMIµÄʵģʽ/V86ģʽÏ¡¢DPMIµÄ±£»¤Ä£Ê½Ï·ÃÎʵĽӿڣ¨Í³³ÆÓ¦Óýӿڣ©,Ç°Á½ÕßÒªÇó±¾VxDÌṩ½Ó¿ÚID,ºóÁ½ÕßÖ»ÒªÇó±¾VxDÌṩÒÔ0½áβµÄΨһ±êʶ´®;·ÃÎÊÇ°,ÏÈÒª¾²Ì¬»ò¶¯Ì¬×°Èë±¾VxD£¨µÚ4ÕßÒªÇó¾²Ì¬×°È룩. µÚ1,3Õ߿ɱ»ÆÕͨ»ã±à³ÌÐò·ÃÎÊ,µÚ2,4Õ߿ɱ»ÔÚBCµÄwindows 3.x£¨16£©Æ½Ì¨ÉÏÉú³ÉµÄWindows³ÌÐò·ÃÎÊ.
¡¡¡¡£¨4£© Control MessagesÒ³°üÀ¨: ¶Ô³öÏÖÔÚWindows 3.1¼°Windows 95Öи÷ÏûÏ¢µÄÏìÓ¦,È羲̬װÈëʱµÄDYNAMIC_INITÏûÏ¢.
¡¡¡¡£¨5£© Windows95 Control MessagesÒ³°üÀ¨: ¶ÔÖ»³öÏÖÔÚWindows 95Öи÷ÏûÏ¢µÄÏìÓ¦,È綯̬װÈëʱµÄSYS_DYNAMIC_INITÏûÏ¢.
¡¡¡¡£¨6£© ÓÃC++ʵÏÖVxDʱ,ClassesÒ³°üÀ¨: ´ÓÐéÄâÉ豸Çý¶¯³ÌÐòÀàVDeviceÅÉÉúµÄÀàÃû£¨ÈçMyDevice£©,´ËÀàµÄ³ÉÔ±º¯Êý½«½ÓÊÕ£¨4£©¼°£¨5£©Ò³ÖгöÏֵĴó¶àÊýÏûÏ¢.
¡¡¡¡´ÓVMʵÀýÀàVVirtualMachineÅÉÉúµÄÀàÃû£¨ÈçMyVM£©,´ËÀàµÄ³ÉÔ±º¯Êý½«½ÓÊչᴩÔÚVMÉúÃüÆÚÖеĸ÷ÏûÏ¢,ÈçϵͳVM³õÆôÏûÏ¢Sys_VM_Init;
¡¡¡¡´ÓÏß³ÌʵÀýÀàVThreadÅÉÉúµÄÀàÃû£¨ÈçMyThread£©.´ËÀàµÄ³ÉÔ±º¯Êý½«½ÓÊչᴩÔÚÏß³ÌÉúÃüÆÚÖеĸ÷ÏûÏ¢,ÈçÐÂÏ̳߳õÆôÏûÏ¢THREAD_INIT;
¡¡¡¡£¨7£© Output FilesÒ³°üÀ¨: ÌåÏÖÒÔÉÏÄÚÈݵÄ3¸öVxDÎļþ£¨.h,.c»ò.cpp,.mak£©½«±»´æ·ÅµÄĿ¼λÖÃ.
¡¡¡¡3. C++ÓïÑÔµÄVxDÓëÍâ½çͨѶµÄËùÓнӿÚ: ÎÒÃǽ«¼òҪʵÏÖmy.VxDµÄÓ¦Óýӿڼ°·þÎñ,ËüÃǾù×÷ΪÀàµÄº¯Êý³ÉÔ±,´æÓÚmy.h,my.cppÖÐ.
¡¡¡¡£¨1£© ±»32λCÓ¦ÓóÌÐò·ÃÎʵĽӿÚ:
¡¡¡¡Ó¦ÓóÌÐòÏÈÓÃCreateFile´ò¿ªVxD,ºóÓÃDeviceIoControlʹVMM·¢ËÍW32_DEVICEIOCONTROLÏûÏ¢¸øVxD:
¡¡¡¡HANDLE h;char ibuf[2],obuf[2];BOOL r;DWORD oc;OVERLAPPED o;
¡¡¡¡h=CreateFile£¨"\\\\.\\my.vxd",0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0£©; //´ò¿ª¾²Ì¬my.VxD,»ò¶¯Ì¬×°Èëmy.VxD
¡¡¡¡r=DeviceIoControl£¨h,ÃüÁîÂëC,ibuf,sizeof£¨ibuf£©,obuf,sizeof£¨obuf£©,&oc,NULL»ò&o£©; /*Óëmy.VxDµÄʼþ¹ý³ÌOnW32DeviceIoControl½»»»Êý¾Ý,ÓÃibufÏòVxD´«Êý¾Ý,ÓÃobuf´ÓVxDÈ¡ Êý¾Ý,VxD´«»ØµÄÊý¾Ý×ÜÁ¿·ÅÔÚocÖÐ*/
¡¡¡¡CloseHandle£¨h£©;//¹Ø±Õ»ò¶¯Ì¬Ð¶ÏÂVxD
¡¡¡¡my.VxDÓ¦ÔÚwindows 95 control messagesÒ³ÉÏÑ¡W32_DEVICEIOCONTROLʼþ,ÔÚ DWORD MyDevice::OnW32DeviceIoControl£¨PIOCTLPARAMS p£©Ê¼þ¹ý³ÌÖÐд:
switch£¨p->dioc_IOCtlCode£©{
case ÃüÁîÂëC:
ÓÃpÖ¸ÏòµÄIOCTLPAR
AMS½á¹¹,ÓëÓ¦ÓóÌÐò½»»»Êý¾Ý;
if £¨³É¹¦£© return£¨0£©; /*
ʹDeviceIoControlµÄ·µ»ØÖµrΪTRUE*/
else return£¨1£©;
default:
return£¨0£©;
}
¡¡¡¡ÒÔÉÏ×ö·¨ÒªÇóVxDÁ¢¼´½»»»Êý¾Ý£¨Í¬²½Í¨Ñ¶£©,ÖµFILE_FLAG_DELETE_ON_CLOSEÖ¸Ã÷ CloseHandle½«²»ÔÚÄÚ´æÖб£ÁôÒýÓüÇÊýΪ0µÄVxD.
¡¡¡¡VxDÒ²¿ÉÑÓ³Ù½»»»Êý¾Ý,´Ëʱ,Ó¦ÓóÌÐòÏÈ´«ÖµFILE_FLAG_DELETE_ON_CLOSE|FILE_FLAG_OVERLAPPED
¡¡¡¡µ½CreateFile,ÓÃo.hEvent=CreateEvent£¨0,TRUE,0,NULL£©´´½¨Ê¼þ,ÔÙ´«oµÄµØÖ·µ½DeviceIoControl,È»ºóÓÃGetOverlappedResult£¨h,&o,&oc,TRUE£©ÔÚoÉÏ˯Ãß.
¡¡¡¡´Ëʱ,p->lpoOverlappedÒ»¶¨´óÓÚ0,VxD¿ÉÓÃVMM·þÎñ_LinPageLock,°´Ò³ÉÏËøp->dioc_InBufÖ¸ÏòµÄÓ¦ÓóÌÐòibufÇø,p->dioc_OutBufÖ¸ÏòµÄobufÇø,p->lpoOverlappedÖ¸ÏòµÄo½á¹¹.Òª½»»»Êý¾Ýʱ,¿ÉÖÃÊý¾Ý¼°Êý¾Ý×ÜÁ¿µ½p->dioc_OutBuf¼°p->lpoOverlapped->O_InternalHigh,È»ºóµ÷ÓÃVMM·þÎñ
¡¡¡¡VWIN32_DIOCCompletionRoutine£¨p->lpoOverlapped->O_Internal£©»½ÐÑÓ¦ÓóÌÐò.
¡¡¡¡VMM¶¯Ì¬×°Ð¶VxDʱ,ÒÔÃüÁîÂë0¼°-1·¢ËÍW32_DEVICEIOCONTROLÏûÏ¢¸øVxD,¹ÊVireo¹«Ë¾½¨ÒéÃüÁîÂëCÈ¡[2048,4095].
¡¡¡¡£¨2£© ±»Real/V86ģʽÏÂ16λӦÓóÌÐò·ÃÎʵĽӿÚ:
¡¡¡¡my.VxDÏÈÒªÖ¸¶¨½Ó¿ÚID£¨Èç3180h£©,ÔÙÔÚAPIÒ³ÉÏÑ¡Standard Application Entry Points¿òÖеÄReal/V86 Mode±êÇ©,¼´¿ÉÉú³ÉMyDevice::V86_API_EntryÈë¿Ú,·ÃÎÊËüµÄ»ã±à³ÌÐòÊÇ:
entry dd ?
mov ax,1684h ;¹¦ÄܺÅ
mov bx,3180h ;½Ó¿ÚID
int 2fh ;È¡Èë¿ÚµÄ¶Î/
Æ«ÒƵ½es/di,³É¹¦Ê±,
di¼°es·µ»Ø·ÇÁãÖµ
mov ax,es
or ax,di
jz L0
mov word ptr [entry],di
mov word ptr [entry+2],es
mov ah,ÂëC
call [entry]
¡¡¡¡L0: ´íÎó´¦Àí
MyDevice::V86_API_Entry£¨VMHANDLE hVM
,CLIENT_STRUCT* p£©Èë¿Ú¿ÉÒÔÊÇ:
if £¨p->CBRS.Client_AH==ÂëC£© p->CBRS.Client_AL=0;
¡¡¡¡£¨3£© ±»±£»¤Ä£Ê½ÏÂ16λӦÓóÌÐò·ÃÎʵĽӿÚ:
¡¡¡¡Ó루2£©ÀàËÆ,µ«Ñ¡Protected Mode±êÇ©,¼´¿ÉÉú³ÉMyDevice::PM_API_EntryÈë¿Ú,·ÃÎÊËüµÄ³ÌÐòÊÇ:
int PASCAL WinMain£¨HANDLE h1,HANDLE h0,
LPSTR lpCmdLine,int nCmdShow£©{
FARPROC entry; //32λ
_asm{
mov ax,1684h
mov bx,3180h
int 2fh;È¡Èë¿ÚµÄÑ¡Ôñ·û/Æ«ÒƵ½es/di,³É¹¦Ê±,di¼°es·µ»Ø·ÇÁãÖµ
mov ax,es
or ax,di
jz L0
mov word ptr [entry],di
mov word ptr [entry+2],es
mov ah,ÂëC
call [entry]
}
¡¡¡¡¶ÔPM_API_EntryµÄ´¦ÀíÈ磨3.2£©.
¡¡¡¡£¨4£© ±»DPMIµÄʵģʽ/V86ģʽÏÂ16λӦÓóÌÐò·ÃÎʵĽӿÚ:
¡¡¡¡Ó루2£©ÀàËÆ,µ«ÔÚAPIÒ³ÉÏÑ¡Vendor Specific Application Entry PointsÖеÄReal/V86 Mode±êÇ©,È»ºóÔÚVendor ID StringÖÐÊäÈëΨһ±êʶ´®my,¼´¿ÉÉú³ÉMy_V86VendorEntry::handlerÈë¿Ú,·ÃÎÊËüµÄ³ÌÐòÊÇ:
str db 'my',0 ;VxDµÄΨһ±êʶ´®
entry dd ?
mov ax,168Ah ;¹¦ÄܺÅ
lea si,str ;ÒªÇóds/siÖµÊÇstrµÄ¶ÎÖµ/Æ«ÒÆÖµ
int 2Fh ;È¡Èë¿ÚµÄ¶Î/Æ«ÒƵ½es/di,³É¹¦Ê±,al·µ»Ø0
cmp al,0
jne L0
mov word ptr [entry],di
mov word ptr [entry+2],es
...
call [entry]
¡¡¡¡¶ÔhandlerµÄ´¦ÀíÈ磨3.2£©.
¡¡¡¡£¨5£© ±»DPMIµÄ±£»¤Ä£Ê½ÏÂ16λӦÓóÌÐò·ÃÎʵĽӿÚ: Ó루4£©ÀàËÆ,µ«Ñ¡Protected Mode±êÇ©,¼´¿ÉÉú³ÉMy_ProtVendorEntry::handlerÈë¿Ú,·ÃÎÊËüµÄ³ÌÐòÊÇ:
int PASCAL WinMain£¨HANDLE h1,HANDLE h0,
LPSTR lpCmdLine,int nCmdShow£©{
char *id="my";
FARPROC entry;
_asm{
mov ax,168Ah
mov si,id
int 2Fh ;È¡Èë¿ÚµÄÑ¡Ôñ·û/Æ«ÒƵ½es/di
cmp al,0
...
}
}
¡¡¡¡¶ÔhandlerµÄ´¦ÀíÈ磨3.2£©.
¡¡¡¡£¨6£© ¿É±»ÆäËüVxD·ÃÎʵĽӿÚ:
¡¡¡¡Èôyour.VxDÓûµ÷my.VxDµÄ×öÁ½ÊýÏà¼õµÄminus½Ó¿Ú,ÐèÔÚmy.VxDµÄVxD serviceÒ³ÉÏÊäÈëÔÐÍDWORD _cdecl minus£¨DWORD i,DWORD j£©,ÔÙÔÚMyDevice::minusÖÐ,дreturn£¨i-j£©;
¡¡¡¡your.makÖÐ,Ðè´¦ÀíÖмäÎļþwrap.cpp:
OBJECTS=your.OBJ wrap.obj
...
wrap.OBJ:wrap.cpp my.h
¡¡¡¡wrap.cppÖÐ,¶Ô´ø²ÎÊýµÄVxD·þÎñ,ÐèÓÃVMMºêÖ¸ÁîVxDJmpתÈë,¸÷²ÎÊý½øÈëwrapʱ,ÒÑ°´CµÄµ÷ÓÃÔ¼¶¨ÈëÕ»;¶Ô²»´ø²ÎÊýVxD·þÎñ,¿Éµ÷ÓÃVMMºêÖ¸ÁîVxDCall£¨½Ó¿ÚÃû£©:
#include "my.h"
DWORD _cdecl MyDevice::
minus£¨DWORD i,DWORD j£©{
VxDJmp£¨minus£©;
}
¡¡¡¡your.cppµÄijһº¯Êýf,¿ÉÓÃVMM·þÎñGet_DDB,²émy.VxDÊÇ·ñÒÑ×°Èë,ÈôδװÈë,ÔòÓÃVxDLDR·þÎñ
¡¡¡¡VxDLDR_LoadDevice½«Æä×°Èë:
#define DEVICE_MAIN
#include "your.h"
Declare_Virtual_Device£¨YOUR£©
#undef DEVICE_MAIN
¡¡¡¡#include "my.h" //´ËÐÐÐèÔÚDEVICE_MAINÍâ
VOID f£¨£©{
PDEVICEINFO pinfo;
PDDB pddb;
DWORD r;
pddb=Get_DDB£¨0,"MY "£©;
//Óÿոñ²¹È«³¤¶ÈСÓÚ8µÄVxDÃû
if £¨pddb==0£© {//δװÈë
r=VxDLDR_LoadDevice£¨"my.VxD",
VxDLDR_INIT_DEVICE,&pinfo,&pddb£©;
if £¨r!=0£© //VxDLDR_LoadDeviceδÄܳɹ¦×°Èëmy.VxD
return;
}
MyDevice::minus£¨Öµ1,Öµ2£©;
}