RedCamel 2016-01-20 23:39 采纳率: 0%
浏览 2220

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

  • 写回答

3条回答 默认 最新

  • 91program 博客专家认证 2016-01-21 00:31
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误