Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777 (+6 невидимых)

 eXeL@B —› Программирование —› Определение текущего HDD
Посл.ответ Сообщение


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 21 июля 2008 11:15
· Личное сообщение · #1

Если в компьютере больше одного HDD, каким образом можно определить с какого именно запущена программа (интересует именно устройство, а не логический диск). Для говнопривязки проги к SN винчестера, хоть это и не красиво, но какой заказчик, такой и софт

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 95.2 (постоянный), 26thx
Активность: 0.060
Статус: Участник

Создано: 21 июля 2008 12:27
· Личное сообщение · #2

www.gotdotnet.ru/Forums/Common/28266.aspx#31334



Ранг: 16.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 21 июля 2008 13:31
· Личное сообщение · #3

Вот примерчик на Делфе:

procedure CorrectDevInfo(buff: pchar); // Вспомогательная процедура
var i,idx:integer;
x : word;
begin
for i:=0 to 9 do
begin
idx := $14+i+i;
x := pword(buff+idx)^;
pword(buff+idx)^ := swap(x);
end;

for i := 0 to $17 do
begin
idx := $14+26+i+i;
x := pword(buff+idx)^;
pword(buff+idx)^ := swap(x);
end;
end;


procedure GetDevInfoNT(devno : byte);
var gvip:GETVERSIONINPARAMS;
scip : SENDCMDINPARAMS;
scop : SENDCMDOUTPARAMS;
cmd:BYTE;
dwBytesReturned:DWORD;
h:Cardinal;
begin
scsiflag := false;
h := Createfile( pchar('\.\PhysicalDrive'+inttostr(devno)), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);


if h = INVALID_HANDLE_VALUE then raise Exception.Create('Can''t create device handle!');

try
fillchar(gvip,sizeof(GETVERSIONINPARAMS),#0);
fillchar(scip,sizeof(SENDCMDINPARAMS),#0);
fillchar(scop,sizeof(SENDCMDOUTPARAMS),#0);

if not DeviceIoControl(h,SMART_GET_VERSION,nil,0,@gvip,
sizeof(GETVERSIONINPARAMS),dwBytesReturned,nil)
then raise Exception.Create('DeviceIoControl filed!');
// if ((gvip.gvip_bIDEDeviceMap shr devno) and 1) = 1 then
cmd := ID_CMD;
// else
// cmd := ATAPI_ID_CMD;

scip.scip_dwBufferSize := 512;
scip.scip_bDriveNumber := devno;
scip.scip_irDriveRegs.ir_bSectorCountReg := 1;
scip.scip_irDriveRegs.ir_bSectorNumberReg := 1;
scip.scip_irDriveRegs.ir_bDriveHeadReg := ((devno + 1) shl 4) or $a0;
scip.scip_irDriveRegs.ir_bCommandReg := cmd;
if not DeviceIoControl(h,SMART_RCV_DRIVE_DATA,@scip,sizeof(SENDCMDINPARAMS),
@scop,sizeof(SENDCMDOUTPARAMS),dwBytesReturned,nil)
then raise Exception.Create('DeviceIoControl filed!');
if scop.scop_dsDriverStatus.ds_bDriverError <> DRVERR_NO_ERROR
then raise Exception.Create('DeviceIoControl returned error!');

CorrectDevInfo(scop.scop_bBuffer);
move(scop.scop_bBuffer, IdeInfo, 512);

finally
CloseHandle(h);
end;
end;



Ранг: 40.0 (посетитель), 1thx
Активность: 0.030
Статус: Участник

Создано: 21 июля 2008 13:58
· Личное сообщение · #4

MSDN:
To obtain the physical drive for a volume, open a handle to the volume and call the DeviceIoControl function with IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. This control code returns the disk number of offset for each of the volume's extents; a volume can span disks.

Так что из командной строки или вызовом GetModuleFileName(NULL) надо получить логический диск, потом открыть его CreateFile, а потом DeviceIoControl(handle, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, ...).




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 21 июля 2008 18:06 · Поправил: Isaev
· Личное сообщение · #5

inf1kek Я SN уже получил...
Thrasher откуда ты жто вырезал? Не хватает определения кучи структур
или какую библиотеку использовал?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 16.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 22 июля 2008 10:17
· Личное сообщение · #6

Isaev Сорри... Это вырезано из моего проекта ( у меня та же задача стояла - привязать прогу к компу). В аттаче исходники, что компилируются без проблем.

5e64_22.07.2008_CRACKLAB.rU.tgz - Get_HDD_SN.zip




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 22 июля 2008 15:17
· Личное сообщение · #7

=) А на асме есть чтонить еще по жестким ???. Вот тут на асме вроде серийник , но что то очень странно там ))) жесткий у меня один ! а н разделы серийники выдает !

Я гдето видел асм листинг там вообще все данные жесткого собирались , найти не могу.

8711_22.07.2008_CRACKLAB.rU.tgz - 1.zip

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 22 июля 2008 15:28
· Личное сообщение · #8

--> diskid32.cpp <-- http://www.winsim.com/diskid32/

-----
все багрепорты - в личные сообщения





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 23 июля 2008 16:46
· Личное сообщение · #9

Thrasher
Isaev пишет:
Я SN уже получил
см. аттач
Вопрос был:
Если в компьютере больше одного HDD, каким образом можно определить с какого именно запущена программа?
т.к. если HDD 2 или 3, какой из них прога должна проверять? Конечно с которого она стартует... А как определить с какого она стартует и сопоставить с данными, полученными прогой?
Может в какой структуре это и отображается, просто место не знаю.

da46_23.07.2008_CRACKLAB.rU.tgz - HDDInfo.exe

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 05 августа 2008 15:18
· Личное сообщение · #10

Вроде вопрос решён...
спасибо ajax

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh



 eXeL@B —› Программирование —› Определение текущего HDD
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати