简单呀,不用什么驱动开发,直接读就可以了,把文件地址设置成: \\.\{U盘盘符}: 这样就可以读写了,如: '读取I盘的第一个扇区数据并保存到指定文件 Dim buff(511) As Byte Dim fs As Long Dim ReadSize As Long '读取数据过程 fs = CreateFile("\\.\I:", _ GENERIC_READ, _ FILE_SHARE_READ, _ ByVal 0, _ OPEN_EXISTING, _ FILE_ATTRIBUTE_ARCHIVE Or FILE_ATTRIBUTE_HIDDEN Or FILE_ATTRIBUTE_SYSTEM Or FILE_ATTRIBUTE_READONLY, _ 0) ReadFile fs, buff(0), 512, ReadSize, ByVal 0 CloseHandle fs '保存数据过程,将读到的数据保存到 C:\boot.bin 文件中 Open "C:\boot.bin" For Binary As #1 Put #1, 1, buff Close #1这种方法适合与读写软盘、U盘等设备,硬盘分区不适合
\\.\{U盘盘符}:
这样就可以读写了,如: '读取I盘的第一个扇区数据并保存到指定文件
Dim buff(511) As Byte
Dim fs As Long
Dim ReadSize As Long
'读取数据过程
fs = CreateFile("\\.\I:", _
GENERIC_READ, _
FILE_SHARE_READ, _
ByVal 0, _
OPEN_EXISTING, _
FILE_ATTRIBUTE_ARCHIVE Or FILE_ATTRIBUTE_HIDDEN Or FILE_ATTRIBUTE_SYSTEM Or FILE_ATTRIBUTE_READONLY, _
0)
ReadFile fs, buff(0), 512, ReadSize, ByVal 0
CloseHandle fs
'保存数据过程,将读到的数据保存到 C:\boot.bin 文件中
Open "C:\boot.bin" For Binary As #1
Put #1, 1, buff
Close #1这种方法适合与读写软盘、U盘等设备,硬盘分区不适合
这种方法我是验证过,我觉得没问题。
我是用作写 SD 卡的 Bootloader ,用在 ARM11 的 SD 卡启动模式加载系统内核,我用得没问题,你要是用出问题那还真让我长见识了。
而windows驱动程序,其实属于Windows内核的一部分存在的,他运行与保护模式下的Ring0层,应用程序运行于Ring3层,他们的区别主要在于GDT或LDT的内存数据间访问问题。在Windows驱动开发当中,通常是通过调用NT_ASI或DDK宏进行开发,其操作数据的模式和访问文件一样,都是上面类似的操作,区别在于使用的文件地址不一样就能访问到设备,为了应用程序能够让驱动程序做指定的工作,所以通过一些API函数将参数通过IRP包形式传递给驱动程序,驱动通过IRP包内容调用不同的驱动执行指定操作,同时也会将处理完成的数据地址返回给IRP包或地址中,应用程序可以根据这些信息得到驱动状态。而驱动开发中有几个概念,总线驱动、过滤驱动、虚拟设备驱动等,而你的需求,基本上以有了总线驱动的支持,有了这个驱动支持,已经可以对你的设备进行读写操作了,根本就无需再做驱动。因为,说到底层,这种外部设备与计算机的接口,主要是以通讯为基础的,如果你不了解外部设备的通讯协议,根本无法写出这种驱动。虽然USB总线和SD卡的通讯协议都是公开的,但既然系统有了驱动,也就没必要再去写了。
00000010: 02 00 00 00 00 F8 00 00 3F 00 FF 00 00 00 00 00
00000020: 00 86 07 00 C0 03 00 00 00 00 00 00 02 00 00 00
00000030: 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00
00000040: 00 00 29 BF 7A 03 64 4E 4F 20 4E 41 4D 45 20 20
00000050: 20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4
00000060: 7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08
00000070: CD 13 73 05 B9 FF FF 8A F1 66 0F B6 C6 40 66 0F
00000080: B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7
00000090: C9 66 F7 E1 66 89 46 F8 83 7E 16 00 75 38 83 7E
000000A0: 2A 00 77 32 66 8B 46 1C 66 83 C0 0C BB 00 80 B9
000000B0: 01 00 E8 2B 00 E9 48 03 A0 FA 7D B4 7D 8B F0 AC
000000C0: 84 C0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB
000000D0: EE A0 FB 7D EB E5 A0 F9 7D EB E0 98 CD 16 CD 19
000000E0: 66 60 66 3B 46 F8 0F 82 4A 00 66 6A 00 66 50 06
000000F0: 53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4
00000100: 41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55
00000110: AA 0F 85 14 00 F6 C1 01 0F 84 0D 00 FE 46 02 B4
00000120: 42 8A 56 40 8B F4 CD 13 B0 F9 66 58 66 58 66 58
00000130: 66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F7 F1 FE
00000140: C2 8A CA 66 8B D0 66 C1 EA 10 F7 76 1A 86 D6 8A
00000150: 56 40 8A E8 C0 E4 06 0A CC B8 01 02 CD 13 66 61
00000160: 0F 82 54 FF 81 C3 00 02 66 40 49 0F 85 71 FF C3
00000170: 4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00
00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000001A0: 00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 52 65
000001B0: 6D 6F 76 65 20 64 69 73 6B 73 20 6F 72 20 6F 74
000001C0: 68 65 72 20 6D 65 64 69 61 2E FF 0D 0A 44 69 73
000001D0: 6B 20 65 72 72 6F 72 FF 0D 0A 50 72 65 73 73 20
000001E0: 61 6E 79 20 6B 65 79 20 74 6F 20 72 65 73 74 61
000001F0: 72 74 0D 0A 00 00 00 00 00 AC CB D8 00 00 55 AA一看 EB 58 90 和最后的 55 AA 就知道,这个是标准的 Boot 引导扇区内容,如果失败的
话,不可能有这样的引导数据。