Показать сообщение отдельно

  #6  
Старый 29.01.2010, 22:12
AlexTheC0d3r
Постоянный
Регистрация: 25.07.2008
Сообщений: 454
Провел на форуме:
1229135

Репутация: 425
По умолчанию

Цитата:
Сообщение от Gar|k  
Вот тебе функция на Си + WinAPI прямой записи в сектор диска

Код:
#define sPD "\\\\.\\PhysicalDrive%d"

// disks - номер физического диска
// data - указатель на записываемые данные
// szdata - размер записываемых данных
int wr_disk(BYTE disks,unsigned char *data,size_t szdata) {
	unsigned char buf[1024],name[100],ndump[30];
	HANDLE hFile;
	HFILE f;
	//------
	DISK_GEOMETRY_EX dg; // структура геометрии диска
	DWORD junk;
	//------

	sprintf((LPSTR)name,sPD,disks);

	hFile=CreateFile((LPCSTR)name,GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,0,0);
	if(hFile!=INVALID_HANDLE_VALUE)
	{
		if(DeviceIoControl(hFile,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,NULL,0,&dg,sizeof(DISK_GEOMETRY_EX),&junk,NULL))
		{
			if(szdata>dg.Geometry.BytesPerSector){CloseHandle(hFile); return -1;}

			// это можешь опустить здесь создание дампа сектора в файл
			SetFilePointer(hFile,0,0,FILE_BEGIN);
			ReadFile(hFile,&buf[0],dg.Geometry.BytesPerSector,&junk,NULL);
			CloseHandle(hFile);


			sprintf((LPSTR)ndump,"dump_mbr.%6d",rand());
			f=_lcreat((LPCSTR)ndump, 0);
			_lwrite(f,(LPCCH)&buf[0],dg.Geometry.BytesPerSector);
			_lclose(f);
			// ----------------------------------------------------/

			// хм взможно переполнение буфера, но у меня до этого проверки
			memcpy(&buf[0],&data[0],szdata); // сам чет думаю захрена я копирую в дополнительный буффер
			// но факт что записывать можно только блоками = размеру сектора
			// а максимальный размер сектора как раз 1кб байт (вроде)

			hFile=CreateFile((LPCSTR)name,GENERIC_WRITE, FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);
			SetFilePointer(hFile,0,0,FILE_BEGIN);
			WriteFile(hFile,&buf[0],dg.Geometry.BytesPerSector,&junk,NULL);
			if(junk!=dg.Geometry.BytesPerSector){printf("Error write\n");}else{printf("%s write\tOK\n",name);}
			CloseHandle(hFile);

		}
	}
}
разберу немного попозже...но код схож...
 
Ответить с цитированием