ÏêÊöC++ÓïÑÔµÄVxDÓëÍâ½çͨѶµÄËùÓнӿÚ_C/C++ÓïÑÔ_ºÚ¿Í·ÀÏßÍø°²·þÎñÆ÷ά»¤»ùµØ--Powered by WWW.RONGSEN.COM.CN

ÏêÊöC++ÓïÑÔµÄVxDÓëÍâ½çͨѶµÄËùÓнӿÚ

×÷ÕߣººÚ¿Í·ÀÏßÍø°²Íøվά»¤»ùµØ À´Ô´£ººÚ¿Í·ÀÏßÍø°²Íøվά»¤»ùµØ ä¯ÀÀ´ÎÊý£º0

±¾Æª¹Ø¼ü´Ê£ºÓïÑÔÍâ½çͨѶ½Ó¿Ú

Ò».ʲôÊÇ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£©;
}

    ºÚ¿Í·ÀÏßÍø°²·þÎñÆ÷ά»¤·½°¸±¾ÆªÁ¬½Ó£ºhttp://www.rongsen.com.cn/show-300-1.html
Íøվά»¤½Ì³Ì¸üÐÂʱ¼ä:2008-02-22 04:19:51  ¡¾´òÓ¡´ËÒ³¡¿  ¡¾¹Ø±Õ¡¿
ÎÒÒªÉêÇë±¾Õ¾£ºNµã | ºÚ¿Í·ÀÏß¹ÙÍø |  
רҵ·þÎñÆ÷ά»¤¼°Íøվά»¤ÊÖ¹¤°²È«´î½¨»·¾³£¬ÍøÕ¾°²È«¼Ó¹Ì·þÎñ¡£ºÚ¿Í·ÀÏßÍø°²·þÎñÆ÷ά»¤»ùµØÕÐÉ̽øÐÐÖУ¡QQ:29769479

footer  footer  footer  footer