32位-windows10下采用ReadFile读磁盘失败

问题描述

windows10下采用ReadFile读磁盘失败

求高手解答,给出解决方法,谢谢先!
我的小段程序原来可以读整个500G磁盘,XP,WIN7,WIN8下无论32位还是64位,
测试都OK,但在WIN10下失败,只能读到4G。
程序如下:
Public Class Form1
Public hDisk As Integer

Public Declare Function CreateFileA Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As IntPtr, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As IntPtr) As Integer
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
Public Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Integer, ByVal lDistanceToMove As Integer, ByRef lpDistanceToMoveHigh As Integer, ByVal dwMoveMethod As Integer) As Integer
Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Integer, ByVal lpBuffer() As Byte, ByVal nNumberOfBytesToRead As Integer, ByRef lpNumberOfBytesRead As Integer, ByVal lpOverLapped As Integer) As Integer

Public Enum DesiredAccess
    Read = &H80000000
    Write = &H40000000
    Execute = &H20000000
    All = &H10000000
End Enum

Public Enum ShareMode
    Delete = &H4
    Write = &H2
    Read = &H1
    None = 0
End Enum

Public Enum CreateMode
    CreateNew = 1
    CreateAlways = 2
    OpenExisting = 3
    OpenAlways = 4
    TruncateExisting = 5
End Enum

Public Enum OpResult
    ERROR_SUCCESS = 0
    INVALID_HANDLE_VALUE = -1
End Enum

Public Enum FileSeek
    FILE_BEGIN = 0
    FILE_CURRENT = 1
    FILE_END = 2
End Enum

Public Function OpenDisk(ByVal fileName As String) As Boolean
    Try
        hDisk = CreateFileA(fileName, DesiredAccess.Read Or DesiredAccess.Write, ShareMode.Read Or ShareMode.Write, IntPtr.Zero, CreateMode.OpenExisting, 0, IntPtr.Zero)
        OpenDisk = Not (hDisk = OpResult.INVALID_HANDLE_VALUE)
    Catch ex As Exception
        hDisk = False
    End Try
    Return hDisk
End Function

Public Function CloseDisk() As Boolean
    Try
        CloseDisk = CType(CloseHandle(hDisk), Boolean)
    Catch ex As Exception
        CloseDisk = False
    End Try
    Return CloseDisk
End Function

Public Function FxSetFilePointer(ByVal hFile As Integer, ByVal lDistanceToMove As Long, ByVal dwMoveMethod As Integer) As Boolean
    Try
        Dim PosL As Integer
        Dim PosH As Integer
        Dim ret As Integer

        Size2Long(lDistanceToMove, PosL, PosH)
        ret = SetFilePointer(hFile, PosL, PosH, dwMoveMethod)
        If ret = PosL Then
            FxSetFilePointer = True
        Else
            FxSetFilePointer = False
        End If
    Catch ex As Exception
        FxSetFilePointer = False
    End Try
    Return FxSetFilePointer
End Function

Private Sub Size2Long(ByVal FileSize As Long, ByRef IntLow As Integer, ByRef IntHigh As Integer)
    Try
        '&HFFFFFFFF unsigned = 4294967295
        Dim Cutoff As Long

        Cutoff = 2147483647
        Cutoff = Cutoff + 2147483647
        Cutoff = Cutoff + 1 ' now we hold the value of 4294967295 and not -1
        IntHigh = 0
        Do Until FileSize < Cutoff
            IntHigh = IntHigh + 1
            FileSize = FileSize - Cutoff
        Loop
        If FileSize > 2147483647 Then
            IntLow = CType(-Cutoff + (FileSize - 1), Integer)
        Else
            IntLow = CType(FileSize, Integer)
        End If
    Catch ex As Exception
        Throw ex
    End Try
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim a(512 - 1) As Byte

    If OpenDisk("\.PhysicalDrive0") = False Then
        MessageBox.Show("Cannot access disk", "Warnning", MessageBoxButtons.OK, MessageBoxIcon.Stop)
        End
    End If

    If FxSetFilePointer(hDisk, 0L * 512, FileSeek.FILE_BEGIN) = False Then
        Exit Sub
    End If

    If ReadFile(hDisk, a, 512, 0, 0) = 0 Then
        Exit Sub
    End If

    If FxSetFilePointer(hDisk, 8388607L * 512, FileSeek.FILE_BEGIN) = False Then
        Exit Sub
    End If

    If ReadFile(hDisk, a, 512, 0, 0) = 0 Then
        Exit Sub
    End If

    If FxSetFilePointer(hDisk, 8388608L * 512, FileSeek.FILE_BEGIN) = False Then
        Exit Sub
    End If

    'when sectors number>8388607, ReadFile failed, why, what can I do
    If ReadFile(hDisk, a, 512, 0, 0) = 0 Then
        Exit Sub
    End If

    If CloseDisk() = False Then
        MessageBox.Show("Some errors have been occured", "Warnning", MessageBoxButtons.OK, MessageBoxIcon.Stop)
        End
    End If
End Sub

End Class

解决方案

建议你设个断点测试一下,看看哪个函数失败了?再从失败的函数处,获取失败码,再来分析原因。

解决方案二:

设置断点是肯定的,就是读扇区号大于8388608时,无法获得扇区内容了,如何获得失败码,请用代码片段告诉我,谢谢
If FxSetFilePointer(hDisk, 8388608L * 512, FileSeek.FILE_BEGIN) = False Then
Exit Sub
End If

If ReadFile(hDisk, a, 512, 0, 0) = 0 Then
Exit Sub
End If

解决方案三:

非常期待大牛不吝赐教,一直没有解决问题,在线等,谢谢先!

时间: 2024-08-07 03:29:39

32位-windows10下采用ReadFile读磁盘失败的相关文章

Win7 32位系统下如何手动修改磁盘属性

  1.首先鼠标点击win7 32位系统下的开始菜单,然后点击控制面板选项; 2.然后在控制面板中找到并选择打开"管理工具"图标,在管理工具窗口中点击"计算机管理"选项; 3.在打开的"计算机管理"界面中左侧依次展开到"磁盘管理"选项,然后鼠标右击右侧修改的最后那一个分区,也就是M盘,选择"更改驱动器名和路径"选项; 4.在弹出的界面中,选择"更改..."按钮,然后在下拉菜单中,选择F盘

如何在32位系统下安装64位系统

  在论坛看到很多网友提问说32位系统下无法安装64位Windows7系统,这里推荐一个很简单的方法来在32位系统下安装64位系统. 32位系统可以是任意,比如XP,Vista,Windows7的32位. 64位系统同样可以是任意. 安装方法就是我们一直推荐的NT6安装,安装前请先检验文件的MD5值. 如今,估计只有用XP的才用GHOST版系统了吧?对于windows7与windows8我想大多数都是用原版了,不管怎么说官方的还是最干净最放心的,更何况安装速度也不慢了. 而32位与64位,32位

Win7 32位系统下显示颜色校准Screen Calibration的功能和使用方法

  一.需要准备的工作: 确保显示器已经设置为其原始分辨率,这样能够有助于提高校准结果的准确性. 二.Win7 32位系统 下显示颜色校准Screen Calibration功能的具体使用步骤: 1.首先按"Win+R"打开"运行"窗口,然后输入"DCCW"命令,之后回车; 2.然后在弹出来的显示颜色校准窗口中,根据系统的提示点击下一步,然后到"欢迎使用显示颜色校准"界面时开始进行设置; 3.鼠标移动窗口左侧框中的滑块,使右图

win7 32位系统下开机登陆后桌面没有图标的三种处理方法

  win7系统以其强大的功能为用户所欢迎,不过在操作使用电脑的过程中还是会遇到一些让用户棘手的故障问题.最近有win7 32位系统用户发现电脑开机登录后桌面没有图标,这给我们正常操作电脑带来很多的影响,为什么会出现这种情况呢?其实出现这种情况主要是用户操作不当导致系统损坏引起的,下面小编就把解决的方法分享给大家,感兴趣的用户不妨学习下! 一.注册表修复法 如果使用上面方法一后重启又出现没有栏务栏和图标的情况,那么我们可以检查注册表并修复: 1.首先点击win7系统的开始菜单,选择运行, 在运行

32位Linux下安装64位Hadoop的问题

问题描述 32位Linux下安装64位Hadoop的问题 本人最近在学习Hadoop, 使用的版本为2.5.2,目前已经在Linux环境下搭建好了. 但是现在在hadoop中建立上传文件目录时,碰到如下问题: 在/hadoop-2.5.2/bin下执行: ./hdfs dfs -mkdir -p ~/hdfile 之后报出错误提示信息: Java HotSpot(TM) Client VM warning: You have loaded library /home/wluser/hadoop-

解决编译内核模块helloworld.c:1: 错误:代码模式‘kernel’在 32 位模式下不受支持问题,未编译对64位的支持

Makefile内容: KERNELDIR ?=/root/Desktop/work/TI/linux-3.2.0 PWD := $(shell pwd) obj-m += helloworld.o default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: @rm -f *.o *.ord* *.sy* *.mod.* *.ko clean标记中的@表示,执行命令的时候,终端上面不打印rm -r xxx.xx make出错信息: [root

如何在64系统上监视32位模式下ASP.NET程序的性能

如何在64系统上监视32位模式下ASP.NET程序的性能?为何64位系统上的性能计数器会监视不了IIS32位模式下ASP.NET的性能呢? 发生此问题是因为 64 位版本的 Corperfmonext.dll 文件只能枚举 64 位进程. 此外, 32 - 位版本的 Corperfmonext.dll 文件只能枚举 32 位进程. 要在 64 位计算机上查看托管 32 位程序, 请依次单击 开始 . 运行 , 输入%SystemRoot%SysWOW64perfmon.exe然后单击 确定 .即

win7纯净版32位系统下设置电脑允许桌面远程连接的方法

  1.首先在win7纯净版32位系统的桌面中,鼠标右击"计算机"图标,然后选择"属性"选项; 2.接着在弹出来的计算机属性窗口中,点击左侧的"远程设置"项; 3.打开远程系统属性后,切换到"远程"选项卡下,然后可以看到"允许运行任意版本远程桌面的计算机连接"和"仅允许运行使用网络级别身份验证的远程桌面的计算机连接",根据自己的需要勾选这两个选项中的一个,然后点击"应用-确定&

64位下编译的C dll 调试通过, 拷贝到32位机下运行无法找到dll

问题描述 C#中需要调用DLL(C编写的),C#和CDLL都是的同一台机器上编译的,64位但是当把exe拷贝到其他32位机器上时,提示找不到dll.(我是把工程bin/debug路径下的所有文件拷贝过去运行的)试过相对路径,将exe和dll放到同一个目录下,试过绝对路径D:\logDLL.dll试过另一种写法的绝对路径D:/logDLL.dll以上3中情况,在64位机器上,都可以运行但是在32位机器上都提示找不到dll文件C#与DLL编译平台选择的是32位,32位机器和64位机器都是win7sp