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

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

РОМАН ЛУКОВНИКОВ, LRB@SANDY.RU

Спецвыпуск: Хакер, номер #068, стр. 068-026-8


Можно, работая в операционной системе, клонировать ее саму (воспользовавшись для этого ее ресурсами) или создать загрузочный диск и запустить стороннюю программу для клонирования.

Как скопировать содержимое системного и загрузочного раздела на другой раздел? Через Windows Explorer не получится. Во-первых, не скопируются файлы, используемые системой (например, пользовательская ветка реестра, находящаяся в файле NTUSER.DAT в профиле пользователя), во-вторых, не перенесутся NTFS разрешения (или кто-то держит систему на FAT разделе?). Вторую проблему можно решить с помощью утилиты копирования xcopy, в которой с помощью ключа /O сохраняются NTFS-разрешения. Но первую проблему это не решит...

[2.4.2. пишем утилиту клонирования дисков сами.]

Не беда. Раз никто не догадался написать утилиту клонирования дисков прямо из-под Windows – сделаем это сами! Конечно, не будем сильно напрягаться. Наша утилита сможет копировать данные только между абсолютно идентичными жесткими дисками. Зато одним из этих дисков может быть диск, на котором установлена копия Windows, в которой мы работаем прямо сейчас. При запуске без параметров утилита выдаст подсказку с примерами использования.

ЛИСТИНГ

самописная утилита клонирования дисков из-под работающей Windows

#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

#include <stdio.h>

#include <windows.h>

#define NPAGES 4

#define PAGESIZE (4*1048576)

/* Синхронизация между потоками */

CRITICAL_SECTION cs;

/* Страницы буфера чтения данных */

char * cPages;

/* Текущая записываемая страница */

int iCurpage=0;

/* Страниц считано */

int iPagesRed=0;

/* Чтение закончено */

int iStop=0;

/* Число байт в последней странице */

int iInLastPage=0;

/* Поток чтения из файла */

DWORD WINAPI ReadFileInBuf(LPVOID arg){

int iPageToFill;

DWORD dwBytesRed;

while(1){

/* Если нет свободных страниц — спим */

while(iPagesRed==NPAGES)Sleep(10);

/* Синхронизуемся перед использованием переменных */

EnterCriticalSection(&cs);

/* Номер страницы, на которую считываются данные */

iPageToFill = ((iCurpage + iPagesRed)%NPAGES);

iInLastPage = 0;

LeaveCriticalSection(&cs);

/* Заполняем страницу */

if(ReadFile((HANDLE)arg,

cPages + iPageToFill*PAGESIZE,

PAGESIZE, &dwBytesRed, NULL))

iInLastPage += dwBytesRed;

EnterCriticalSection(&cs);

/* Страница считана */

iPagesRed += 1;

if(iInLastPage != PAGESIZE){

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