J'utilise dans mon programme la fonctionnalité "Kernel32.dll" pour accéder aux secteurs de disque bruts sur le système d'exploitation WinXP SP3 (disque dur externe). Tout fonctionne bien jusqu'à ce que le programme atteigne le numéro de secteur 8388607 - ce qui signifie que le décalage d'octets dans SetFilePointer dépasse 32 bits (uint!). Mais mon code, comme ci-dessous, utilise toutes les variables comme "long". Qu'est ce que je fais mal?C# - Accès aux secteurs bruts en décalage supérieur (supérieur à 4G) sur le disque dur externe
Le code (sur "Dump" bouton clic):
int drive = DRV.SelectedIndex; // DRV is the drive combo box
long bps = BytesPerSector(drive), spt = GetTotalSectors(drive);
string dr = DRV.SelectedItem.ToString();
int moveToHigh, read = 0;
uint GENERIC_READ = 0x80000000;
uint OPEN_EXISTING = 3;
SafeFileHandle handleValue = CreateFile(dr, GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
if (handleValue.IsInvalid)
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
// idx = Loop starting index
// FS = The starting sector index
// TS = The final sector index
long idx = (FS == -1) ? 0 : FS, tot = (TS == -1) ? spt : TS;
for (; idx < tot; idx++)
{
byte[] b = new byte[bps];
// HERE IS THE ISSUE!!!
SetFilePointer(handleValue, idx*bps), out moveToHigh, EMoveMethod.Current);
if (ReadFile(handleValue, b, bps, out read, IntPtr.Zero) == 0)
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
if (this.IsDisposed == true) { handleValue.Close(); break; }
Application.DoEvents();
}
handleValue.Close();
Les fonctions externes Kernel32.dll:
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint SetFilePointer(
[In] SafeFileHandle hFile,
[In] long lDistanceToMove,
[Out] out int lpDistanceToMoveHigh,
[In] EMoveMethod dwMoveMethod);
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32", SetLastError = true)]
internal extern static int ReadFile(SafeFileHandle handle, byte[] bytes,
int numBytesToRead, out int numBytesRead, IntPtr overlapped_MustBeZero);
J'ai essayé beaucoup de choses, mais aucune idée de ce qui ne va pas, l'application juste se terminant par une exception fatale demandant d'envoyer un rapport de bug
Merci beaucoup
Que se passe-t-il alors? Les erreurs? Et pourquoi utiliseriez-vous des doubles pour les entiers? Aussi longtemps dans .NET n'est pas la même que la longue dans Win32API. –