char _devicename[] = "\\\\.\\A:";
// _devicename[4] += drive;
hDevice = CreateFile(_devicename,
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
Прямой доступ к диску A:
Насколько мне известно, в NT системах можно организовать прямой доступ к диску A: без использования каких-то драйверов и т.д. Как это сделать?
Цитата:
Originally posted by Volly
Насколько мне известно, в NT системах можно организовать прямой доступ к диску A: без использования каких-то драйверов и т.д. Как это сделать?
Насколько мне известно, в NT системах можно организовать прямой доступ к диску A: без использования каких-то драйверов и т.д. Как это сделать?
непонятно что подразумевается под прямым доступом... если чтение конкретного сектора - получаешь хэндл диска через:
Код:
устанавливаешь указатель на нужный сектор:
Код:
SetFilePointer (hDevice, (startinglogicalsector*512), NULL, FILE_BEGIN);
и читаешь сектор:
Код:
ReadFile (hDevice, buffer, 512*numberofsectors, &bytesread, NULL);
данный способ работает под 2к/хр, в 98 так не получится
Работа с диском не через системные функции, а напрямую. По крайней мере в программке WinHex такое возможно, и работает это и под NT, и под 9x. В данном случае мне надо перезаписать загрузочный сектор (первые 512 байт) из программы.
Цитата:
Originally posted by Volly
непонятно что подразумевается под прямым доступом
Работа с диском не через системные функции, а напрямую. По крайней мере в программке WinHex такое возможно, и работает это и под NT, и под 9x. В данном случае мне надо перезаписать загрузочный сектор (первые 512 байт) из программы.
непонятно что подразумевается под прямым доступом
Работа с диском не через системные функции, а напрямую. По крайней мере в программке WinHex такое возможно, и работает это и под NT, и под 9x. В данном случае мне надо перезаписать загрузочный сектор (первые 512 байт) из программы.
я тебе привел код, который поможет прочитать и записать загрузочный сектор (WinHex аналогично работает). напиши свою програмку и посмотри, что она тебе афишировать будет - WinHex то же самое покажет.
Для 9х винды данный код работать не будет, т.к. в 9х диск не являлся файлом, необходимо было пользовать обращение к диску через DeviceIOControl.
В инете где-то была подробная статья про это дело.
держи полный код процедуры:
Код:
char * CDiskViewDoc::ReadSector(int drive, DWORD startinglogicalsector, int numberofsectors)
{
// All msdos data structures must be packed on a 1 byte boundary
#pragma pack (1)
struct
{
DWORD StartingSector ;
WORD NumberOfSectors ;
DWORD pBuffer;
}ControlBlock;
#pragma pack ()
#pragma pack (1)
typedef struct _DIOC_REGISTERS
{
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS ;
#pragma pack ()
char* buffer = (char*)malloc (512*numberofsectors);
HANDLE hDevice ;
DIOC_REGISTERS reg ;
BOOL fResult ;
DWORD cb ;
// Creating handle to vwin32.vxd (win 9x)
hDevice = CreateFile ( "\\\\.\\vwin32",
0,
0,
NULL,
0,
FILE_FLAG_DELETE_ON_CLOSE,
NULL );
if ( hDevice == INVALID_HANDLE_VALUE )
{
// win 2k code
HANDLE hDevice;
DWORD bytesread;
// Creating a handle to drive a: using CreateFile () function ..
char _devicename[] = "\\\\.\\A:";
_devicename[4] += drive;
hDevice = CreateFile(_devicename,
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return NULL;
// Setting the pointer to point to the start of the sector we want to read ..
SetFilePointer (hDevice, (startinglogicalsector*512), NULL, FILE_BEGIN);
if (!ReadFile (hDevice, buffer, 512*numberofsectors, &bytesread, NULL) )
return NULL;
}
else
{
// code for win 95/98
ControlBlock.StartingSector = (DWORD)startinglogicalsector;
ControlBlock.NumberOfSectors = (DWORD)numberofsectors ;
ControlBlock.pBuffer = (DWORD)buffer ;
//-----------------------------------------------------------
// SI contains read/write mode flags
// SI=0h for read and SI=1h for write
// CX must be equal to ffffh for
// int 21h's 7305h extention
// DS:BX -> base addr of the
// control block structure
// DL must contain the drive number
// (01h=A:, 02h=B: etc)
//-----------------------------------------------------------
reg.reg_ESI = 0x00 ;
reg.reg_ECX = -1 ;
reg.reg_EBX = (DWORD)(&ControlBlock);
reg.reg_EDX = drive+1;
reg.reg_EAX = 0x7305 ;
// 6 == VWIN32_DIOC_DOS_DRIVEINFO
fResult = DeviceIoControl ( hDevice,
6,
&(reg),
sizeof (reg),
&(reg),
sizeof (reg),
&cb,
0);
if (!fResult || (reg.reg_Flags & 0x0001)) return NULL;
}
CloseHandle(hDevice);
return buffer;
}
{
// All msdos data structures must be packed on a 1 byte boundary
#pragma pack (1)
struct
{
DWORD StartingSector ;
WORD NumberOfSectors ;
DWORD pBuffer;
}ControlBlock;
#pragma pack ()
#pragma pack (1)
typedef struct _DIOC_REGISTERS
{
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS ;
#pragma pack ()
char* buffer = (char*)malloc (512*numberofsectors);
HANDLE hDevice ;
DIOC_REGISTERS reg ;
BOOL fResult ;
DWORD cb ;
// Creating handle to vwin32.vxd (win 9x)
hDevice = CreateFile ( "\\\\.\\vwin32",
0,
0,
NULL,
0,
FILE_FLAG_DELETE_ON_CLOSE,
NULL );
if ( hDevice == INVALID_HANDLE_VALUE )
{
// win 2k code
HANDLE hDevice;
DWORD bytesread;
// Creating a handle to drive a: using CreateFile () function ..
char _devicename[] = "\\\\.\\A:";
_devicename[4] += drive;
hDevice = CreateFile(_devicename,
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return NULL;
// Setting the pointer to point to the start of the sector we want to read ..
SetFilePointer (hDevice, (startinglogicalsector*512), NULL, FILE_BEGIN);
if (!ReadFile (hDevice, buffer, 512*numberofsectors, &bytesread, NULL) )
return NULL;
}
else
{
// code for win 95/98
ControlBlock.StartingSector = (DWORD)startinglogicalsector;
ControlBlock.NumberOfSectors = (DWORD)numberofsectors ;
ControlBlock.pBuffer = (DWORD)buffer ;
//-----------------------------------------------------------
// SI contains read/write mode flags
// SI=0h for read and SI=1h for write
// CX must be equal to ffffh for
// int 21h's 7305h extention
// DS:BX -> base addr of the
// control block structure
// DL must contain the drive number
// (01h=A:, 02h=B: etc)
//-----------------------------------------------------------
reg.reg_ESI = 0x00 ;
reg.reg_ECX = -1 ;
reg.reg_EBX = (DWORD)(&ControlBlock);
reg.reg_EDX = drive+1;
reg.reg_EAX = 0x7305 ;
// 6 == VWIN32_DIOC_DOS_DRIVEINFO
fResult = DeviceIoControl ( hDevice,
6,
&(reg),
sizeof (reg),
&(reg),
sizeof (reg),
&cb,
0);
if (!fResult || (reg.reg_Flags & 0x0001)) return NULL;
}
CloseHandle(hDevice);
return buffer;
}
А пройдет ли такая же махинация, но для жестких дисков?
Цитата:
Originally posted by Volly
А пройдет ли такая же махинация, но для жестких дисков?
А пройдет ли такая же махинация, но для жестких дисков?
под хр пройдет - т.к. она не различает тип накопителя, под 9х не тестировал.
Если я правильно понимаю, то таким образом можно создавать image файлы дисков и записывать их обратно, не перезагружаясь в другую ОС (MS-DOS, например)?
Цитата:
Originally posted by Volly
Если я правильно понимаю, то таким образом можно создавать image файлы дисков и записывать их обратно, не перезагружаясь в другую ОС (MS-DOS, например)?
Если я правильно понимаю, то таким образом можно создавать image файлы дисков и записывать их обратно, не перезагружаясь в другую ОС (MS-DOS, например)?
можно
В общем-то, это все, что я хотел узнать. Спасибо.