bensilver: 我也正在搞驱动程序,大家可以一起研究:) 安装具体环境为: (1)装上VC5.0,并装上Studio97 SP3(也在微软站点有下),因为DDK98说: Microsoft Visual C++ version 4.2 or 5.0 (including service packs) for x86-based systems. Microsoft VC++ version 5.0 (including service packs) is required to compile the video capture samples. Note that Visual C++ 6.0 is not supported for any of the samples. (2)装上98DDK,在www.microsoft.com/ddk有下(3)如要用上汇编,到asm.yeah.net下载MASM32。(4)到www2.cs.uestc.edu.cn下载DriverStudio2.0,安装上就可以了。DriverStudio是基于VC和DDK的基础上开发的.至于资料,我觉得还是看DriverStudio的帮助比较好,市面上的驱动程序的书我几乎都买全了,当大都是WDM的,只有一本《Windows设备驱动程序技术内幕》是讲VxD的,但写书的人实在是太差,用不上:(
调用可以使用WinIoControl
调用可以使用WinIoControl
最后要关闭,否则你的Driver的源程序修改,不会影响你系统中的Driver
我参考了VtoolsD所带的例程,cpp\r0fileio具体方法为第一次加载失败后,如:
const PCHAR VxDName = "\\\\.\\HELLO";
DWORD ErrorNumber;
HANDLE hldr;
const PCHAR VxDFile = "HELLO.VXD"; DWORD IoctlCode;
DWORD nRet;
hDevice = CreateFile(VxDName, 0,0,0, CREATE_NEW, 0, 0); if (hDevice == INVALID_HANDLE_VALUE)
{
ErrorNumber = GetLastError();
hldr = CreateFile(
"\\\\.\\VXDLDR",
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL); if (hldr == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "unable to open VXDLDR: %x\n", GetLastError());
return;
}
IoctlCode = VXDLDR_APIFUNC_LOADDEVICE; if (!DeviceIoControl(hldr, IoctlCode, VxDFile, strlen(VxDFile)+1, NULL, 0, &nRet, NULL) )
fprintf(stderr, "ERROR: load failed.\n");
else
hDevice = CreateFile(VxDName, 0,0,0, CREATE_NEW, 0, 0); printf("FileOpen Error!!!");
CloseHandle(hDevice);
}
else
{
printf("Operation Ok"); CloseHandle(hDevice);
}
我也正在搞驱动程序,大家可以一起研究:)
安装具体环境为:
(1)装上VC5.0,并装上Studio97 SP3(也在微软站点有下),因为DDK98说:
Microsoft Visual C++ version 4.2 or 5.0 (including service packs) for x86-based systems. Microsoft VC++ version 5.0 (including service packs) is required to compile the video capture samples. Note that Visual C++ 6.0 is not supported for any of the samples. (2)装上98DDK,在www.microsoft.com/ddk有下(3)如要用上汇编,到asm.yeah.net下载MASM32。(4)到www2.cs.uestc.edu.cn下载DriverStudio2.0,安装上就可以了。DriverStudio是基于VC和DDK的基础上开发的.至于资料,我觉得还是看DriverStudio的帮助比较好,市面上的驱动程序的书我几乎都买全了,当大都是WDM的,只有一本《Windows设备驱动程序技术内幕》是讲VxD的,但写书的人实在是太差,用不上:(
具体如下:
在VxD中,
DWORD IpxDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
HANDLE hAppWin;
DWORD uMsg = 0;
PVOID dwRefData;
switch (pDIOCParams->dioc_IOCtlCode)
{
case DIOC_OPEN:
break;
case DIOC_CLOSEHANDLE:
break;
case 100:
hAppWin = *(HANDLE*)(pDIOCParams->dioc_InBuf);
uMsg = 0xFF00; //暂时定的消息号
if(SHELL_PostMessage(hAppWin, uMsg, 0, 0, 0, dwRefData))
{
*(DWORD*)(pDIOCParams->dioc_OutBuf) = 1234;
}
else
{
*(DWORD*)(pDIOCParams->dioc_OutBuf) = 5678;
return 1;
}
break;
default:
break;
}
return DEVIOCTL_NOERROR;
}
////////////////////////////////////////////////////////////////////////
在App中:
HANDLE inBuffer;
inBuffer= AfxGetMainWnd()->ShowWindow(AfxGetMainWnd()->GetStyle());
inBuffer = AfxGetInstanceHandle();
DWORD outBuffer = 0;
ioCode = 100;status = DeviceIoControl(
hDevice,
ioCode,
&inBuffer,
sizeof(HANDLE),
&outBuffer,
sizeof(DWORD),
&nRet,
NULL
);我在App中用PostMessage(0xFF00, 0, 0)消息正常相应,可是要VxD发送,虽然返回值是1234(SHELL_PostMessage成功返回),消息就是没有被相应:(各位大虾,给我诊断一下,好吗?
DriverStudio2.0(www2.cs.uestc.edu.cn)中带VtoolsD
下一步我将搞中断截取……
我用Hook_V86_Int_Chain,怎么试也没有成功,
能否伸出援助之手
希望大家多多交流
二、用QuickVxD设计的VxD在Monitor下打开后无法启动,总提示出现11号“Unexpected error”,这是什么意思?
三、例程中出现了很多 Thunk,英译为“转换器”,但究竟该怎么理解?
四、不知还有没有更好的调试工具?最后是在下的一个希望:愿各位对Win VxD有所了解的大虾谈谈自己的一些经验,小弟将感激不尽! ICQ:55777846
MAIL:[email protected]