Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #68, ИЮЛЬ 2006 г.

престолонаследование

РОМАН ЛУКОВНИКОВ, 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;

/* Помечаем страницу как записанную */

Назад на стр. 068-026-8  Содержание  Вперед на стр. 068-026-10