阅读:2570回复:24
谁能给我指点,指点
老板要我快速开发一个硬盘驱动程序,用wdm方式,我不知如何下手,本站的倒子又用不上,不知如何是好??
|
|
沙发#
发布于:2002-06-02 20:43
比较无趣的方法。
把PJF的方法中,所有的CREATEFILE -> ZWCREATEFILE READFILE -> ZWREADFILE WRITEFILE -> ZWREITEFILE, DEVICEIOCONTROL -> ZWDEVICEIOCONTORL CLOSEHANDLE -> ZWCLOSE 最后把RING3 CONSOLE移动到RING0去。具体调用,只能自己做接口吧。 这样也能把RING3移动到RING0. -〉这样有意义吗? 其它的方法也有,你先把NTDDK\\SRC\\STORAGE\\CLASSPNP和NTDDK\\SRC\\STORAGE\\DISK先读过再说。 |
|
板凳#
发布于:2002-06-02 20:24
我还是想用WDM驱动的方式进行,能给些指示吗
|
|
地板#
发布于:2002-06-02 20:20
pJf 都给你答案了。
----- 我知道在老DOS下对硬盘直接操作可以能过BIOS调用,也可以根据协议自已编驱动(用PIO方式),但在视窗下我不是很熟,你能保证这种方法的可行性吗,会不会有致命的问题,这和用PIO方式有何区别 ----- 在nt系的os下,不用想这种方法。系统根本就不允许你这么做。 |
|
地下室#
发布于:2002-06-02 20:20
pdf 都给你答案了。
----- 我知道在老DOS下对硬盘直接操作可以能过BIOS调用,也可以根据协议自已编驱动(用PIO方式),但在视窗下我不是很熟,你能保证这种方法的可行性吗,会不会有致命的问题,这和用PIO方式有何区别 ----- 在nt系的os下,不用想这种方法。系统根本就不允许你这么做。 |
|
5楼#
发布于:2002-06-02 19:51
#include<stdio.h>
#include<windows.h> void main() { HANDLE hPhysicalDrive; hPhysicalDrive = CreateFile(\"\\\\\\\\.\\\\PhysicalDrive0\", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if(hPhysicalDrive == INVALID_HANDLE_VALUE) { char szError[80]; wsprintf(szError, \"Error %ld\", GetLastError()); MessageBox(0,\"Drive 0 Open Error\", szError, MB_OK); } else { char data[512]; DWORD dwBytesRead; ReadFile(hPhysicalDrive, data, 512, &dwBytesRead, NULL); CloseHandle(hPhysicalDrive); } } 不行改用deviceiocontrol |
|
6楼#
发布于:2002-06-02 19:51
我知道在老DOS下对硬盘直接操作可以能过BIOS调用,也可以根据协议自已编驱动(用PIO方式),但在视窗下我不是很熟,你能保证这种方法的可行性吗,会不会有致命的问题,这和用PIO方式有何区别
|
|
7楼#
发布于:2002-06-02 19:40
老兄,你说的正规方法是什么呀?
凡是支持lba方式的块设备,没有不支持scsi_path_though的(nt,2k,xp)。反过来你要是要支持20M的硬盘,八成有这种方式有问题。 |
|
8楼#
发布于:2002-06-02 19:29
这样毕竟不是正规的方法,对于要访问100G或120G的大硬盘可行吗,
我没有太多的时间去尝试啊。 |
|
9楼#
发布于:2002-06-02 19:17
楼上的大虾,看到你回答的问题,太佩服你了!不知道能否赐教交流呢?
|
|
10楼#
发布于:2002-06-02 19:07
guardee的方法理论上是没有问题的。实际上大约也有90%以上的可行性。
打开磁盘设备,读写自然不通过文件系统。 如果不幸失败了,大约是disk upper filter的原因。这从情况下,通过试用deviceiocontrol自己发送scsi_path_though可以搞定的。 先试一下readfile,writefile,那样要容易得多。 |
|
11楼#
发布于:2002-06-02 18:36
晕,你自己研究吧,告诉你方法了!要不自己去找吧!本站好象有例子的啊!只要你用createfile(硬盘的名称(\\??\\Physical0),.......),然后就可以进行readfile和writefile()了,他的物理扇区和要读写的扇区长度用字节来计算啊!一个扇区是512啊!
|
|
12楼#
发布于:2002-06-02 17:12
这些函数我当然会用,是基于WIN的文件系统的读和写,但如何能直接对物理扇区进行读写呢,有这样的例子吗。
|
|
13楼#
发布于:2002-06-02 17:03
晕,你在SDK的例子里面搜索一下啊!\\\\??\\\\Phy
|
|
14楼#
发布于:2002-06-02 16:43
我以为这个决不能直接对其物理扇区进行读和写,能不能举个例子说明如何使用。
|
|
15楼#
发布于:2002-06-02 16:38
有啊!MSDN上面有说明的啊!
CreateFile The CreateFile function creates or opens the following objects and returns a handle that can be used to access the object: Consoles Communications resources Directories (open only) Disk devices Files Mailslots Pipes HANDLE CreateFile( LPCTSTR lpFileName, // file name DWORD dwDesiredAccess, // access mode DWORD dwShareMode, // share mode LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD DWORD dwCreationDisposition, // how to create DWORD dwFlagsAndAttributes, // file attributes HANDLE hTemplateFile // handle to template file ); |
|
16楼#
发布于:2002-06-02 16:32
我看了MSDN,里面找不到该函数的用法只有WriteFile(),ReadFile()
,你能不能举个例子如何使用。 |
|
17楼#
发布于:2002-06-02 16:28
这个函数是可以的啊!从物理的0扇区到最后都可以的啊!
|
|
18楼#
发布于:2002-06-02 16:25
本站有个硬盘驱动的倒子,叫\"一个WDM硬盘驱动的倒子\",我觉了其是以PIO型式驱动,但里面一些函数不知为何只能在以C了型式下连接才能通过(如 IoGetConfigurationInformation())以C++形式连接其所在了库找不到,不知为何
|
|
19楼#
发布于:2002-06-02 16:17
这两个函数不能对硬盘进行直接扇区读写,比如我要读0磁道的第3个扇区该怎么办,因我们的硬盘里面的内容是以自已定的文件结构,目录区和数据区都由自已定,哪些扇区放数据,哪些扇区放目录,只能是向硬盘发送读,写命令才行。
|
|
上一页
下一页