BootSector и API
От: voody  
Дата: 19.07.03 19:22
Оценка:
всем добрый день/утро/вечер

может кто-нибудь знает какими функциями можно читать/писать в boot sector диска,
требуется изменить активность раздела

всем откликнувшимся большое спасибо

21.07.03 15:42: Перенесено модератором из 'WIN API' в Низкоуровневое прг. — ХД
Re: BootSector и API
От: L2-Max Украина  
Дата: 19.07.03 19:45
Оценка:
Здравствуйте, voody, Вы писали:

V>всем добрый день/утро/вечер


V>может кто-нибудь знает какими функциями можно читать/писать в boot sector диска,

V>требуется изменить активность раздела

V>всем откликнувшимся большое спасибо


Я вряд ли удовлетворю тебя своим ответом. Чтоб выполнить подобного рода операцию, тебе нужно иметь доступ к нулевому кольцу, то есть стать драйвером. Т. к. винда блокирует для колец 2,3 почти все порты. Поэтому писать на асме у тебя не получится. Еще способ, изучить строение vxd
L2-Max
Re[2]: BootSector и API
От: voody  
Дата: 19.07.03 20:03
Оценка:
Здравствуйте, L2-Max, Вы писали:

LM>Здравствуйте, voody, Вы писали:


V>>всем добрый день/утро/вечер


V>>может кто-нибудь знает какими функциями можно читать/писать в boot sector диска,

V>>требуется изменить активность раздела

V>>всем откликнувшимся большое спасибо


LM>Я вряд ли удовлетворю тебя своим ответом. Чтоб выполнить подобного рода операцию, тебе нужно иметь доступ к нулевому кольцу, то есть стать драйвером. Т. к. винда блокирует для колец 2,3 почти все порты. Поэтому писать на асме у тебя не получится. Еще способ, изучить строение vxd


так вроде бы под Borland C++ 3.1 были функции типа biosdisk или diskbios и работали нормально
Re[3]: BootSector и API
От: L2-Max Украина  
Дата: 19.07.03 23:46
Оценка:
V>так вроде бы под Borland C++ 3.1 были функции типа biosdisk или diskbios и работали нормально

Ну так, в том то и дело, что те функции под дос !!! Они не работают под вин. А тема вроде как WinAPI, и там спец функции есть, но незнаю есть ли работа с секторами, я с файлами пока не возился.
L2-Max
Re: BootSector и API
От: Proc  
Дата: 20.07.03 08:30
Оценка:
Здравствуйте, voody, Вы писали:

V>всем добрый день/утро/вечер


V>может кто-нибудь знает какими функциями можно читать/писать в boot sector диска,

V>требуется изменить активность раздела

V>всем откликнувшимся большое спасибо


Попробуй использовать, например, следующий код:

#include <windows.h>
#include <winioctl.h> // From the Win32 SDK \Mstools\Include
#include "ntddcdrm.h" // From the Windows NT DDK \Ddk\Src\Storage\Inc
/*
This code reads sectors 16 and 17 from a compact disc and writes
the contents to a disk file named Sector.dat
*/ {
HANDLE hCD, hFile;
DWORD dwNotUsed; // Disk file that will hold the CD-ROM sector data.
hFile = CreateFile ("sector.dat",
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL); // For the purposes of this sample,
// drive F: is the CD-ROM drive.
hCD = CreateFile ("\\\\.\\F:", GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL); // If the CD-ROM drive was successfully opened, read sectors
// 16 and 17 from it and write their contents out to a disk
// file.
if (hCD != INVALID_HANDLE_VALUE)
{
DISK_GEOMETRY dgCDROM;
PREVENT_MEDIA_REMOVAL pmrLockCDROM; // Lock the compact disc in the CD-ROM
// drive to prevent accidental
// removal while reading from it.
pmrLockCDROM.PreventMediaRemoval = TRUE;
DeviceIoControl (hCD, IOCTL_CDROM_MEDIA_REMOVAL,
&pmrLockCDROM, sizeof(pmrLockCDROM), NULL,
0, &dwNotUsed, NULL); // Get sector size of compact disc
if (DeviceIoControl (hCD, IOCTL_CDROM_GET_DRIVE_GEOMETRY,
NULL, 0, &dgCDROM, sizeof(dgCDROM),
&dwNotUsed, NULL))
{
LPBYTE lpSector;
DWORD dwSize = 2 * dgCDROM.BytesPerSector; // 2 sectors
// Allocate buffer to hold sectors from compact disc. Note that
// the buffer will be allocated on a sector boundary because the
// allocation granularity is larger than the size of a sector on a
// compact disk.
lpSector = VirtualAlloc (NULL, dwSize,
MEM_COMMIT|MEM_RESERVE,
PAGE_READWRITE); // Move to 16th sector for
// something interesting to read.
SetFilePointer (hCD, dgCDROM.BytesPerSector * 16,
NULL, FILE_BEGIN); // Read sectors from the compact disc
// and write them to a file.
if (ReadFile (hCD, lpSector, dwSize, &dwNotUsed, NULL))
WriteFile (hFile, lpSector, dwSize, &dwNotUsed, NULL);
VirtualFree (lpSector, 0, MEM_RELEASE);
}
// Unlock the disc in the CD-ROM drive.
pmrLockCDROM.PreventMediaRemoval = FALSE;
DeviceIoControl (hCD, IOCTL_CDROM_MEDIA_REMOVAL,
&pmrLockCDROM, sizeof(pmrLockCDROM), NULL,
0, &dwNotUsed, NULL); CloseHandle (hCD);
CloseHandle (hFile);
}
}

Только вместо CD-ROM'а используй нужный тебе диск.
Re: BootSector и API
От: Murr Россия  
Дата: 20.07.03 12:07
Оценка:
Здравствуйте, voody, Вы писали:

V>всем добрый день/утро/вечер


V>может кто-нибудь знает какими функциями можно читать/писать в boot sector диска,

V>требуется изменить активность раздела

Что такое boot-sector диска? Или MBR(?) диска (HDD) или boot-sector раздела, наверное.

Если нужно изменить активный(?) раздел, то откройте \\.\PhysicalDrive0 или \\.\PhysicalDrive1 и читайте/пишите туда. Только всвязи с такой глупостью есть несколько но:
1) винда может закэшировать MBR и при перезагрузке перетереть его или криво сделать update.
2) MBR как такового может не быть, поскольку в настоящее время даже в винде временами используется другой формат загрузки и разметки HDD.
3) всё, что угодно.
Re[2]: BootSector и API
От: voody  
Дата: 20.07.03 12:42
Оценка:
Здравствуйте, Murr, Вы писали:

M>Здравствуйте, voody, Вы писали:


V>>всем добрый день/утро/вечер


V>>может кто-нибудь знает какими функциями можно читать/писать в boot sector диска,

V>>требуется изменить активность раздела

M>Что такое boot-sector диска? Или MBR(?) диска (HDD) или boot-sector раздела, наверное.


M>Если нужно изменить активный(?) раздел, то откройте \\.\PhysicalDrive0 или \\.\PhysicalDrive1 и читайте/пишите туда. Только всвязи с такой глупостью есть несколько но:

M>1) винда может закэшировать MBR и при перезагрузке перетереть его или криво сделать update.
M>2) MBR как такового может не быть, поскольку в настоящее время даже в винде временами используется другой формат загрузки и разметки HDD.
M>3) всё, что угодно.

вообще правильнее будет сказать MBR, и с \\.\PhysicalDrive0 все вроде работает но только под NT, а надо под 9х, может чем-нить поможешь?
И еще выяснил, что можно использовать старенькие _bios_disk, но почему-то только для чтения, при записи в функция возвращает ошибку 0х301, которой нет в описании
Re[2]: BootSector и API
От: voody  
Дата: 20.07.03 12:46
Оценка:
Здравствуйте, Proc, Вы писали:

P>Здравствуйте, voody, Вы писали:


V>>всем добрый день/утро/вечер


V>>может кто-нибудь знает какими функциями можно читать/писать в boot sector диска,

V>>требуется изменить активность раздела

V>>всем откликнувшимся большое спасибо


P>Попробуй использовать, например, следующий код:


P>#include <windows.h>

P>#include <winioctl.h> // From the Win32 SDK \Mstools\Include
P>#include "ntddcdrm.h" // From the Windows NT DDK \Ddk\Src\Storage\Inc
P>/*
P> This code reads sectors 16 and 17 from a compact disc and writes
P> the contents to a disk file named Sector.dat
P>*/ {
P> HANDLE hCD, hFile;
P> DWORD dwNotUsed; // Disk file that will hold the CD-ROM sector data.
P> hFile = CreateFile ("sector.dat",
P> GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
P> FILE_ATTRIBUTE_NORMAL, NULL); // For the purposes of this sample,
P> // drive F: is the CD-ROM drive.
P> hCD = CreateFile ("\\\\.\\F:", GENERIC_READ,
P> FILE_SHARE_READ|FILE_SHARE_WRITE,
P> NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
P> NULL); // If the CD-ROM drive was successfully opened, read sectors
P> // 16 and 17 from it and write their contents out to a disk
P> // file.
P> if (hCD != INVALID_HANDLE_VALUE)
P> {
P> DISK_GEOMETRY dgCDROM;
P> PREVENT_MEDIA_REMOVAL pmrLockCDROM; // Lock the compact disc in the CD-ROM
P> // drive to prevent accidental
P> // removal while reading from it.
P> pmrLockCDROM.PreventMediaRemoval = TRUE;
P> DeviceIoControl (hCD, IOCTL_CDROM_MEDIA_REMOVAL,
P> &pmrLockCDROM, sizeof(pmrLockCDROM), NULL,
P> 0, &dwNotUsed, NULL); // Get sector size of compact disc
P> if (DeviceIoControl (hCD, IOCTL_CDROM_GET_DRIVE_GEOMETRY,
P> NULL, 0, &dgCDROM, sizeof(dgCDROM),
P> &dwNotUsed, NULL))
P> {
P> LPBYTE lpSector;
P> DWORD dwSize = 2 * dgCDROM.BytesPerSector; // 2 sectors
P> // Allocate buffer to hold sectors from compact disc. Note that
P> // the buffer will be allocated on a sector boundary because the
P> // allocation granularity is larger than the size of a sector on a
P> // compact disk.
P> lpSector = VirtualAlloc (NULL, dwSize,
P> MEM_COMMIT|MEM_RESERVE,
P> PAGE_READWRITE); // Move to 16th sector for
P> // something interesting to read.
P> SetFilePointer (hCD, dgCDROM.BytesPerSector * 16,
P> NULL, FILE_BEGIN); // Read sectors from the compact disc
P> // and write them to a file.
P> if (ReadFile (hCD, lpSector, dwSize, &dwNotUsed, NULL))
P> WriteFile (hFile, lpSector, dwSize, &dwNotUsed, NULL);
P> VirtualFree (lpSector, 0, MEM_RELEASE);
P> }
P> // Unlock the disc in the CD-ROM drive.
P> pmrLockCDROM.PreventMediaRemoval = FALSE;
P> DeviceIoControl (hCD, IOCTL_CDROM_MEDIA_REMOVAL,
P> &pmrLockCDROM, sizeof(pmrLockCDROM), NULL,
P> 0, &dwNotUsed, NULL); CloseHandle (hCD);
P> CloseHandle (hFile);
P> }
P>}

P>Только вместо CD-ROM'а используй нужный тебе диск.

спасибо за ответ, что-то иэ этого конечно работать будет, но только под nt, а под win9х, просто никак, прочитал что можно использовать 0х25/0х26 прерывания для чтения/записи, но пока не получается , может что-нить можешь под win9х предложить?
Re[3]: BootSector и API
От: Рома Россия  
Дата: 20.07.03 17:54
Оценка:
Здравствуйте, voody, Вы писали:

V>вообще правильнее будет сказать MBR, и с \\.\PhysicalDrive0 все вроде работает но только под NT, а надо под 9х, может чем-нить поможешь?

V>И еще выяснил, что можно использовать старенькие _bios_disk, но почему-то только для чтения, при записи в функция возвращает ошибку 0х301, которой нет в описании

Программы, которые работаю в эмуляции DOS на самом деле не работают с портами напрямую. В виртуальной машине DOS работа с портами эмулируется. Т.е. ты пишешь в порт, происходит проверка через карту портов доступен порт или нет в данном кольце, если не доступен, возникает исключение процессора и дальнейшая обработка идёт через драйвера. Эта эмуляция сделана для совместимости, и windows всё равно не даст тебе что-нибудь подозрительное делать.
Так что, под W2k через CreateFile и DeviceIoControl, под 9x как тебе уже сказали, через драйвера.
... << RSDN@Home 1.0 beta 7a >>
Re: BootSector и API
От: Valerio Россия linkedin.com/in/boronin
Дата: 21.07.03 03:58
Оценка:
поиск и еще раз поиск!
Автор: Valerio
Дата: 17.05.03
... << RSDN@Home 1.1 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: BootSector и API
От: Proc  
Дата: 21.07.03 09:00
Оценка:
Здравствуйте, voody, Вы писали:

V>спасибо за ответ, что-то иэ этого конечно работать будет, но только под nt, а под win9х, просто никак, прочитал что можно использовать 0х25/0х26 прерывания для чтения/записи, но пока не получается , может что-нить можешь под win9х предложить?


Для Win9x может пригодиться следующий код:

#include <windows.h> #define VWIN32_DIOC_DOS_INT25 2
#define VWIN32_DIOC_DOS_INT26 3
#define VWIN32_DIOC_DOS_DRIVEINFO 6
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, *PDIOC_REGISTERS;
#define CARRY_FLAG 1
#pragma pack(1)
typedef struct _DISKIO {
DWORD dwStartSector; // starting logical sector number
WORD wSectors; // number of sectors
DWORD dwBuffer; // address of read/write buffer
} DISKIO, * PDISKIO;
#pragma pack() /*------------------------------------------------------------------
ReadLogicalSectors (hDev, bDrive, dwStartSector, wSectors, lpSectBuff) Purpose:
Reads sectors from a logical drive. Uses Int 25h. Parameters:
hDev
Handle of VWIN32 bDrive
The MS-DOS logical drive number. 1 = A, 2 = B, 3 = C, etc. dwStartSector
The first logical sector to read wSectors
The number of sectors to read lpSectBuff
The caller-supplied buffer that will contain the sector data Return Value:
Returns TRUE if successful, or FALSE if failure. Comments:
This function does not validate its parameters.
------------------------------------------------------------------*/
BOOL ReadLogicalSectors (HANDLE hDev,
BYTE bDrive,
DWORD dwStartSector,
WORD wSectors,
LPBYTE lpSectBuff)
{
BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
DISKIO dio = {0}; dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.dwBuffer = (DWORD)lpSectBuff;
reg.reg_EAX = bDrive — 1; // Int 25h drive numbers are 0-based.
reg.reg_EBX = (DWORD)&dio;
reg.reg_ECX = 0xFFFF; // use DISKIO struct
fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_INT25,
&reg, sizeof(reg),
&reg, sizeof(reg), &cb, 0); // Determine if the
// DeviceIoControl call
// and the read succeeded.
fResult = fResult && !(reg.reg_Flags & CARRY_FLAG);
return fResult;
}
/*------------------------------------------------------------------
WriteLogicalSectors (hDev, bDrive, dwStartSector, wSectors, lpSectBuff) Purpose:
Writes sectors to a logical drive. Uses Int 26h Parameters:
hDev
Handle of VWIN32 bDrive
The MS-DOS logical drive number. 1 = A, 2 = B, 3 = C, etc. dwStartSector
The first logical sector to write wSectors
The number of sectors to write lpSectBuff
The caller-supplied buffer that contains the sector data Return Value:
Returns TRUE if successful, or FALSE if failure. Comments:
This function does not validate its parameters.
------------------------------------------------------------------*/
BOOL WriteLogicalSectors (HANDLE hDev,
BYTE bDrive,
DWORD dwStartSector,
WORD wSectors,
LPBYTE lpSectBuff)
{
BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
DISKIO dio = {0}; dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.dwBuffer = (DWORD)lpSectBuff;
reg.reg_EAX = bDrive — 1; // Int 26h drive numbers are 0-based.
reg.reg_EBX = (DWORD)&dio;
reg.reg_ECX = 0xFFFF; // use DISKIO struct
fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_INT26,
&reg, sizeof(reg),
&reg, sizeof(reg), &cb, 0); // Determine if the
// DeviceIoControl call
// and the write succeeded.
fResult = fResult && !(reg.reg_Flags & CARRY_FLAG);
return fResult;
}
/*------------------------------------------------------------------
NewReadSectors(hDev, bDrive, dwStartSector, wSectors, lpSectBuff) Purpose:
Reads the specified number of sectors into a caller-supplied
buffer. Uses Int 21h function 7305h Parameters:
hDev
Handle of VWIN32 bDrive
The MS-DOS logical drive number. 0 = default, 1 = A, 2 = B,
3 = C, etc. dwStartSector
The first sector to read. wSectors
The number of sectors to read. lpSectBuff
The caller-supplied buffer to read into. Return Value:
Returns TRUE if successful, or FALSE if failure. Comments:
This function does not validate its parameters. It assumes that
lpSectBuff is allocated by the caller and is large enough to
hold all of the data from all of the sectors being read.
------------------------------------------------------------------*/
BOOL NewReadSectors (HANDLE hDev,
BYTE bDrive,
DWORD dwStartSector,
WORD wSectors,
LPBYTE lpSectBuff)
{
BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
DISKIO dio;
dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.lpBuffer = (DWORD)lpSectBuff;
reg.reg_EAX = 0x7305; // Ext_ABSDiskReadWrite
reg.reg_EBX = (DWORD)&dio;
reg.reg_ECX = -1;
reg.reg_EDX = bDrive; // Int 21h, fn 7305h drive numbers are 1-based
fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_DRIVEINFO,
&reg, sizeof(reg),
&reg, sizeof(reg), &cb, 0); // Determine if the
// DeviceIoControl call and
// the read succeeded.
fResult = fResult && !(reg.reg_Flags & CARRY_FLAG);
return fResult;
}
/*------------------------------------------------------------------
NewWriteSectors(hDev, bDrive, dwStartSector, wSectors, lpSectBuff) Purpose:
Writes the specified number of sectors from a caller-supplied
buffer. Uses Int 21h function 7305h Parameters:
hDev
Handle of VWIN32 bDrive
The MS-DOS logical drive number. 0 = default, 1 = A, 2 = B,
3 = C, etc. dwStartSector
The first sector to write. wSectors
The number of sectors to write. lpSectBuff
The caller-supplied buffer from which to write. Return Value:
Returns TRUE if successful, or FALSE if failure. Comments:
This function does not validate its parameters. It assumes that
lpSectBuff is allocated by the caller and is large enough to
hold all of the data to be written.
------------------------------------------------------------------*/
BOOL NewWriteSectors (HANDLE hDev,
BYTE bDrive,
DWORD dwStartSector,
WORD wSectors,
LPBYTE lpSectBuff)
{
BOOL fResult;
DWORD cb;
DIOC_REGISTERS reg = {0};
DISKIO dio; dio.dwStartSector = dwStartSector;
dio.wSectors = wSectors;
dio.lpBuffer = (DWORD)lpSectBuff;
reg.reg_EAX = 0x7305; // Ext_ABSDiskReadWrite
reg.reg_EBX = (DWORD)&dio;
reg.reg_ECX = -1;
reg.reg_EDX = bDrive; // Int 21h, fn 7305h drive numbers are 1-based
reg.reg_ESI = 0x6001; // Normal file data (See function
// documentation for other values)
fResult = DeviceIoControl(hDev, VWIN32_DIOC_DOS_DRIVEINFO,
&reg, sizeof(reg),
&reg, sizeof(reg), &cb, 0); // Determine if the DeviceIoControl call and the write succeeded.
fResult = fResult && !(reg.reg_Flags & CARRY_FLAG); return fResult;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.