Feng Yuan - MSFT
Try this small piece of repair code:
NOTE:
1) This only works for this case (file with lots of pages generated by MXDW).
2) The original file is over-written, so make a copy of it before using it.
int ZipRepair(const wchar_t * pFileName)
{
HANDLE hFile = CreateFile(pFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return -1;
}
DWORD sizeHigh;
DWORD sizeLow = GetFileSize(hFile, & sizeHigh);
DWORD buffer[25];
DWORD read = 0;
if (SetFilePointer(hFile, sizeLow - 22, NULL, SEEK_SET))
if (ReadFile(hFile, buffer, 22, & read, NULL))
{
DWORD entry = (buffer[2] & 0xFFFF) + 0x10000;
DWORD size = buffer[3];
DWORD offset = buffer[4];
memset(buffer, 0, sizeof(buffer));
buffer[0] = 0x06064b50;
buffer[1] = 44;
buffer[3] = 0x002d002d;
buffer
= entry;
buffer
= entry;
buffer[10] = size;
buffer[12] = offset;
buffer[14] = 0x07064b50;
buffer[16] = sizeLow - 22;
buffer[18] = 1;
buffer[19] = 0x06054b50;
buffer[21] = 0xFFFFFFFF;
buffer[22] = 0xFFFFFFFF;
buffer[23] = 0xFFFFFFFF;
if (SetFilePointer(hFile, sizeLow - 22, NULL, SEEK_SET))
{
if (WriteFile(hFile, buffer, 98, & read, NULL))
{
printf("%S repaired\n", pFileName);
}
}
}
CloseHandle(hFile);
return 0;
}
Thanks for pushing the limits
Feng Yuan