2011-02-10

Steget före

VHD-filer som skapas från dynamiska volymer av wbadmin är inte alltid monterbara som volymer. Då måste man starta om och ha sig om man inte kör virtualisering för att återställa.

Det finns dock enklare sätt. Helst skulle man vilja få den inbyggda VHD-monteringen i Windows 7 att erkänna volymen som en verklig disk, med en partitionstabell. Det är nämligen ungefär så den ser ut.

Men om man ändå tänker återställa är det ganska enkelt. Montera VHD-filen, ta reda på volymnamnet och hoppa till position 0x10000 innan man börjar dra över data. Nedanstående programutdrag demonstrerar det, med lättjeorsakad synkron IO och annat.


HANDLE in = CreateFile(L"\\\\?\\PhysicalDrive4", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
HANDLE out = CreateFile(L"\\\\?\\Volume{abcdefab-2746-11e0-9774-abcdefabcdef}", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);

DWORD retval;
DeviceIoControl(out, FSCTL_LOCK_VOLUME, 0, 0, 0, 0, &retval, 0);
DeviceIoControl(out, FSCTL_DISMOUNT_VOLUME, 0, 0, 0, 0, &retval, 0);
SetFilePointer(in, 0x10000, NULL, FILE_BEGIN);

void* buffer = _aligned_malloc(buffersize, buffersize);
DWORD read;
long long pos = 0;
while (ReadFile(in, buffer, buffersize, (LPDWORD) &read, 0) && read)
{
DWORD written;
WriteFile(out, buffer, read, (LPDWORD) &written, 0);
printf("%d %d\n", written, out);
}
CloseHandle(out);

Inga kommentarer: