阅读:1284回复:14
请问一下win98的硬盘驱动
也就是存储系统,是哪几个vxd文件?
|
|
|
沙发#
发布于:2005-04-05 11:39
应该是ESDI_506.PDR和DISKTSD.VXD吧。
|
|
板凳#
发布于:2005-04-06 09:19
原来如此。谢谢!
我现在没有98 ifs,头疼得要命。 |
|
|
地板#
发布于:2005-04-06 09:41
98ddk含有ifs功能 :D
|
|
|
地下室#
发布于:2005-04-06 11:47
没错,我给Leopard老兄说的要公开的Win98文件系统驱动就是看了regfsd以后搞的。只是还缺一点东西,没有时间放上去。
另外,有个家伙把我的vdisk下下来说不敢用。说怎么没有用系统线程直接就使用句柄了,难道不怕process context问题?我说,我用了一个OBJ_KERNEL_HANDLE标志打开文件(从NT Insider学来的:P),这样打开的句柄都是系统进程的句柄,所以应该就不用系统线程了。应该是对的,我也试过,不过没测试过。 不知道有没有大侠有空帮我瞅瞅,看看这个做法有没有问题? ;) |
|
5楼#
发布于:2005-04-07 15:01
没错,我给Leopard老兄说的要公开的Win98文件系统驱动就是看了regfsd以后搞的。只是还缺一点东西,没有时间放上去。 你的 VDISK 在哪里有下?我也在研究这方面:) |
|
6楼#
发布于:2005-04-07 15:52
比filedisk更简单,网址是http://bcompute.com/rambler/cn/WinDriverDownload.htm。当然,功能也少一些,毕竟是一个演示程序嘛。
|
|
7楼#
发布于:2005-04-07 15:59
你的 VDISK 好象和 REGFSD 没什么关系啊:)
我以为是9X下的REGFSD,我用REGFSD改了个驱动,也就是重定向到其他盘上面,真实的文件读写,查找文件没问题,打开文件就蓝屏了:( |
|
8楼#
发布于:2005-04-07 16:44
vdisk是块设备的,不是我说的98 FSD。
打开文件蓝屏了?你得查一查了。:( 反正我用的挺好的。要具体分析一下才知道。 |
|
9楼#
发布于:2005-04-07 19:30
我是用REGFSD改过来,重定向到另外一个盘,比如 REGFSD 生成的盘是 D 盘,所有读写 D 盘的操作,我都转向到 E 盘,文件显示(FIND 和 FINDNEXT)没问题,当读区大于 512 字节的文件时,就蓝平了,小于512字节的没问题。请教各位朋友,这是个什么问题?
|
|
10楼#
发布于:2005-04-07 19:33
相关代码如下:
VOID __cdecl RequestHandler(IOP * pIop) { PDEVICEPARAMS pDP; IOR* pIor = &pIop->IOP_ior; HKEY h; PCHAR pValue, p; DWORD pos; DWORD ValueSize = READBUFSIZE; CHAR readbuf[READBUFSIZE]; PDEVICEPARAMS pDp; HANDLE filehwnd; WORD pError; CHAR LogBuf[300]; DWORD GetC=0; // dprintf(\"REGFSD: %s initiated\\tIOP=%x\\n\", // GetIOFunctionName(pIor->IOR_func), pIop); pIor->IOR_status = IORS_INVALID_COMMAND; // assume error switch (pIop->IOP_ior.IOR_func) { case IOR_READ: // The IOP was sent by our HandleRead function. The private convention // is: // IOR_start_addr[0] = the Registry key to whose value is to be read // IOR_start_addr[1] = name of value to read // IOR_private_port = file position (byte offset from start of value) dw2(\"========RequestHandler=======<IOR_READ><1>--\",\"Start\"); //h = (HKEY)pIor->IOR_start_addr[0]; filehwnd = (HANDLE)pIor->IOR_start_addr[0]; pValue = (PCHAR)pIor->IOR_start_addr[1]; pos = pIor->IOR_private_port; p = readbuf; // Read the value sprintf(LogBuf,\"%s: <pos=%d><count=%d>\",pValue,pos,pIor->IOR_xfer_count); dw2(\"========RequestHandler=======<IOR_READ><2>--\",LogBuf); //DWORD __cdecl R0_ReadFile(BOOL bInContext, HANDLE h, PVOID buffer, // DWORD Count, DWORD FileOffset, PWORD pError); GetC = R0_ReadFile(FALSE,filehwnd,p,pIor->IOR_xfer_count,pos,&pError); if (pError==0) { sprintf(LogBuf,\"Count:<%d>,RDBSIZE:<%d>,pos<%d>,Getc<%d>\",pIor->IOR_xfer_count,READBUFSIZE,pos,GetC); dw2(\"========RequestHandler=======<READ_ST> <3>--\",LogBuf); pIor->IOR_status = IORS_SUCCESS; //pIor->IOR_xfer_count = min(pIor->IOR_xfer_count, READBUFSIZE-pos); pIor->IOR_xfer_count = min(pIor->IOR_xfer_count, GetC); memcpy((PVOID)pIor->IOR_buffer_ptr, p+pos, GetC); sprintf(LogBuf,\"Count:<%d>,RDBSIZE:<%d>,pos<%d>,Getc<%d>\",pIor->IOR_xfer_count,READBUFSIZE,pos,GetC); dw2(\"========RequestHandler=======<READ_OK> <3>--\",LogBuf); } /*if (RegQueryValueEx(h, pValue, NULL,NULL, p, &ValueSize) == ERROR_SUCCESS) { // If the value is read, then transfer the data to the client buffer if (pos < READBUFSIZE) { pIor->IOR_status = IORS_SUCCESS; pIor->IOR_xfer_count = min(pIor->IOR_xfer_count, READBUFSIZE-pos); memcpy((PVOID)pIor->IOR_buffer_ptr, p+pos, pIor->IOR_xfer_count); } }*/ break; case IOR_GEN_IOCTL: // dprintf(\"\\tdrive=%c function=%x\\n\", pIor->IOR_ioctl_drive+\'A\', // pIor->IOR_ioctl_function); switch (pIor->IOR_ioctl_function) { case 0x440D: // Get Device Parameters pDp = (PDEVICEPARAMS)pIor->IOR_ioctl_buffer_ptr; if ( (pIor->IOR_ioctl_control_param & 0xff) == 0x60) { IoctlGetDeviceParams(pDp); pIor->IOR_status = IORS_SUCCESS; } break; } break; default: pIor->IOR_status = IORS_INVALID_COMMAND; break; } // Invoke the completion handler. First pop off the empty entry at the // top of the stack. Note: IOP_callback_ptr is type as IOP_callback_entry*, // not ULONG when using VtoolsD. --pIop->IOP_callback_ptr; pIop->IOP_callback_ptr->IOP_CB_address(pIop); } |
|
11楼#
发布于:2005-04-07 20:45
你可以不用IOS_SendCommand调用RequestHandler,而是在HandleRead中直接干活就行了。regfsd多此一举,搞得很复杂,没有必要。
蓝屏的问题是不是重入了,导致堆栈溢出 - 比如你调用系统文件函数时又一次调用了你的处理函数。你写E盘是调用的R0文件函数吧? |
|
12楼#
发布于:2005-04-07 23:09
是的,是调用R0文件函数,但是没到写这一步就蓝屏了。调试信息是这样的:
23:46:26 Admin: ========VolOpen=======<True>-- E:\\XPICON.DLL 23:46:26 Admin: ========VolOpen======= XPICON.DLL 0 23:46:26 Admin: ========VolOpen=======<True>-- Open Success 23:46:26 Admin: ========HandleSeek=======<3>-- FILE_BEGIN,<ir_pos=0> 23:46:26 Admin: ========HandleSeek=======<5>-- End,<ir_pos=0> 23:46:26 Admin: ========RequestHandler=======<IOR_READ><1>-- Start 23:46:26 Admin: ========RequestHandler=======<IOR_READ><2>-- E:\\XPICON.DLL: <pos=0><count=30720> |
|
13楼#
发布于:2005-04-08 13:33
做驱动有一个增量开发的原则,就是先做一个最小的。对了以后,在一点一点把你自己的东西加上去。每对了一次,就马上用SourceSafe或Cvs这样的版本工具做一个Label。这样,就可以查出你的问题来。
建议你先把regfsd扒干净,只留一个空壳。然后一步一步把你的东西加进去,错误就会现出原形了。 :D regfsd肯定是没问题的,尽管有一个BUG。不过,你还没有做到那里,所以现在是没有问题的。 祝你好运 :) |
|
14楼#
发布于:2005-04-08 18:52
谢谢了。
其他没什么问题,就死在读取那个地方,只有暂时搁着了。 |
|