У меня проблема с ReadFile и перекрыта.
Сначала я использую ReadFile с перекрытием 0
ZeroMemory(&overlapped ,sizeof(OVERLAPPED));
hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if(hDevice != INVALID_HANDLE_VALUE){
ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
}
с помощью for () я могу видеть байты, используя printf ()
for (int n=0; n<sizeof(buff); n++)
{
printf("0x%02X ", buff[n]);
}
и теперь у меня есть один вариант с большим количеством
crbig = 322122547
d1 = (DWORD*)crbig;
overlapped.Offset = d1[1]; //22122547
overlapped.OffsetHigh = d1[0];// 00000003
Мне нужно использовать ReafFile дважды, на этот раз используется overlapped () со значениями смещения и высокого смещения
d1 = (DWORD*)&crbig;
overlapped.Offset = d1[1];
overlapped.OffsetHigh = d1[0];
ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
но for () печатает те же байты, которые выдает мне первый файл ReadFile, я пытался очистить буфер с помощью memset () или использовать другой буфер, но всегда показываю мне одни и те же байты
Предположительно, Overlapped () говорит ReadFile, куда нужно идти, и читает 1024 байта, и сохраняет его в буфере, но ничего не происходит, буфер имеет те же первые байты, что overlapped () = 0
это полный код
int main(int argc, char *argv[]){
HANDLE hDevice;
OVERLAPPED overlapped;
DWORD crbig;
BYTE buff[1024] = {0};
DWORD numerobyte = 0, nbytes = 0;
UINT32 ret;
DWORD *d1;
int offset1 = 11, offset2 = 13, offset3 = 30;
long MFTCluster = 0, bytespercluster = 0, sectperclusters = 0, offet = 0;
unsigned long mult = 0;
ZeroMemory(&overlapped ,sizeof(OVERLAPPED));
hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if(hDevice != INVALID_HANDLE_VALUE){
ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
}else
{
return NULL;
}
if(ret == 0){ret = WaitForSingleObject(hDevice,INFINITE );
switch (ret)
{
case WAIT_OBJECT_0:break;
case WAIT_TIMEOUT:break;
default:
break;
}
}
else
{
return NULL;
}if((int)buff[3] == 'N' && (int)buff[4] == 'T' && (int)buff[5] == 'F' && (int)buff[6] == 'S' ){
printf("Volumen es formato NTFS\n\n\n");
}
bytespercluster = endianhextodec(buff, offset1);
sectperclusters = endianhextodec(buff, offset2);
MFTCluster = endianhextodec(buff, offset3);
crbig = (sectperclusters * (bytespercluster * MFTCluster));
d1 = (DWORD*)&crbig;
overlapped.Offset = d1[1];
overlapped.OffsetHigh = d1[0];
ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
if(ret == 0){ret = WaitForSingleObject(hDevice,INFINITE );
switch (ret)
{
case WAIT_OBJECT_0:break;
default:
break;
}
}
else
{
return NULL;
}
for (int n=0; n<sizeof(buff); n++)
{
printf("0x%02X ", buff[n]);
}
CloseHandle(hDevice);
getchar();
}
VB.NET
Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64)
Dim lowoffset() As Byte = BitConverter.GetBytes(curBig)
Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0)
Dim high As Int32
Dim lastbytes(3) As Byte
Array.Copy(lowoffset, 4, lastbytes, 0, 4)
high = BitConverter.ToInt32(lastbytes, 0)
NO.OffsetLow = highoffset
NO.OffsetHigh = high
End Sub
SetReadFileOffset(NO, MFTCluster * SectperCluster * BytesPerSect)
ret = ReadFile(Hnd, Buffer, 1024, nRead, NO)
If ret = 0 Then
ret = WaitForSingleObject(Hnd, INFINITE)
Select Case ret
Case WAIT_OBJECT_0
Case Else
End Select
Else
Return Nothing
End If
Задача ещё не решена.
Других решений пока нет …