престолонаследование РОМАН ЛУКОВНИКОВ, LRB@SANDY.RU Спецвыпуск: Хакер, номер #068, стр. 068-026-9 /* Дошли до конца файла или ошибка */ iStop = 1; break; } LeaveCriticalSection(&cs); // printf("+"); // fflush(stdout); } LeaveCriticalSection(&cs); return 0; } int main(int argc, char *argv[]){ DWORD n, dwBytesToWrite, dwBytesWritten; char * cDrive; char buf[256]; int c; HANDLE hFrom, hTo, hThread; LONGLONG llFileLength=0; int iSmallPageSize; SYSTEM_INFO si; GetSystemInfo(&si); iSmallPageSize = si.dwPageSize; if(argc!=3){ fprintf(stderr, "Windows NT/2K/XP Hard Drive copy\n" "Usage: %s <from_path> <to_path>\n" " # — Disk number (0 means first hard drive) of path\n" " Examples:\n" " %s 0 1\n" "\tcopies disk 0 to disk 1\n" " %s 0 file.img\n" "\tcopies disk 0 to file.img\n" " %s file.img 1\n" "\tcopies file.img to disk 1\n" "(c) 2006 by Vladimir Dubrovin\n" , argv[0], argv[0], argv[0], argv[0]); return 1; } /* Открываем файл, из которого копировать */ if(*argv[1]>='0' && *argv[1]<='9' && !argv[1][1]){ sprintf(buf, "\\\\.\\PhysicalDrive%d", atoi(argv[1])); cDrive = buf; } else cDrive = argv[1]; printf("From: %s\n", cDrive); hFrom=CreateFile(cDrive, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING|FILE_FLAG_SEQUENTIAL_SCAN, NULL); if(hFrom == INVALID_HANDLE_VALUE){ fprintf(stderr, "Unable to access device\n"); return 2; } /* Открываем файл, в который копировать */ if(*argv[2]>='0' && *argv[2]<='9' && !argv[2][1]){ sprintf(buf, "\\\\.\\PhysicalDrive%d", atoi(argv[2])); cDrive = buf; } else cDrive = argv[2]; printf("To: %s, are you sure (y/n)?", cDrive); if((c = getchar()) != 'y' && c != 'Y') return 10; hTo=CreateFile(cDrive, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING|FILE_FLAG_SEQUENTIAL_SCAN, NULL); if(hTo == INVALID_HANDLE_VALUE){ fprintf(stderr, "Unable to access device\n"); return 3; } fflush(stdout); if(!(cPages = VirtualAlloc(NULL, PAGESIZE*NPAGES, MEM_COMMIT, PAGE_READWRITE))){ fprintf(stderr, "VirtualAlloc failed\n"); return 4; } /* запускаем поток считывания из файла */ InitializeCriticalSection(&cs); hThread = CreateThread(NULL, 0, ReadFileInBuf, (LPVOID)hFrom, 0, &n); if(hThread == NULL){ fprintf(stderr, "Failed to create thread \n"); return 5; } CloseHandle(hThread); /* начинаем запись файла */ while(1){ /* ждем, пока не появятся страницы для записи */ while(!iStop && !iPagesRed)Sleep(1); /* синхронизуем потоки */ EnterCriticalSection(&cs); if(iStop && !iPagesRed) break; /* кончился файл */ /* Если дошли до конца — то писать страницу, округленную до размера системной страницы */ dwBytesToWrite = (iStop && iPagesRed == 1)? ((iInLastPage + iSmallPageSize — 1) / iSmallPageSize) * iSmallPageSize : PAGESIZE; LeaveCriticalSection(&cs); /* Пишем файл */ dwBytesWritten = 0; if(WriteFile(hTo, cPages + iCurpage*PAGESIZE, dwBytesToWrite, &n, NULL)) dwBytesWritten += n; if(dwBytesWritten!=PAGESIZE) break; /* Помечаем страницу как записанную */ |