hilpers


  hilpers > comp.lang.* > comp.lang.delphi

 #1  
12.05.2005, 14:05
Kayn
Salve,
Come da oggetto, avrei bisogno di leggere byte a byte ogni singolo
cluster del mio HDD. Potete indicarmi se esiste una qualche libreria, un
componente o quant'altro in merito.
Grazie,
Kayn.
 #2  
12.05.2005, 14:28
microges
Se usi Windows 2000, NT o XP devi crearti un driver apposito per
accedere all'hardware, mentre se usi Windows 95 o 98 puoi utilizzare
l'API DeviceIoControl ed accedere direttamente agli interrupt 13 (bios),
21, 25 e 26 del DOS in questa maniera:

//----------------------------------------------------------------------
// Usati per l'accesso diretto all'hardware
// ----------------------------------------------------------------------
Const
VWin_Dioc_Dos_Ioctl = 1; // INT 21h - Funzioni Da 4400h a 4411h
VWin_Dioc_Dos_Int25 = 2; // INT 25h - Disk Read
VWin_Dioc_Dos_Int26 = 3; // INT 25h - Disk Write
VWin_Dioc_Dos_Int13 = 4; // INT 13h

Var
hDevice : THandle; // Handle del device
isOpen : Boolean; // Device aperto o chiuso

Const
flgCarry = $001;
flgParity = $002;
flgAuxiliary = $004;
flgZero = $008;
flgSign = $010;
flgTrap = $020;
flgInterrupt = $040;
flgDirection = $080;
flgOverflow = $100;

Var
DIOCError : Dword;

Type
DIOC_REGISTERS = Record
EBX : Dword;
EDX : Dword;
ECX : Dword;
EAX : Dword;
EDI : Dword;
ESI : Dword;
Flags : Dword;
End;


// Queste accedono al device driver di comunicazione hardware
Function DoIOCTLOpened(Var REG : DIOC_REGISTERS;
DIOC_Function : Dword) : Boolean;
Var
fResult : Boolean;
CB : Dword;
Begin
fResult := DeviceIoControl(hDevice,
DIOC_Function,
@REG, SizeOf(REG),
@REG, SizeOf(Reg),
CB, Nil);

If Not fResult Then DIOCError := Reg.EAX;

Result := fResult;
End;

Function DoIOCTL(Var REG : DIOC_REGISTERS;
DIOC_Function : Dword) : Boolean;
Var
fResult : Boolean;
CB : Dword;
Begin
If isOpen Then
Begin
Result := DoIOCTLOpened(REG, DIOC_Function);
Exit;
End;

hDevice := CreateFile('\\.\VWIN32',
0,
0,
Nil,
0,
FILE_FLAG_DELETE_ON_CLOSE,
0);

If hDevice <> INVALID_HANDLE_VALUE Then
Begin
fResult := DeviceIoControl(hDevice,
DIOC_Function,
@REG, SizeOf(REG),
@REG, SizeOf(REG),
CB, Nil);

If Not fResult Then DIOCError := Reg.EAX;
CloseHandle(hDevice);
End
Else
Begin
fResult := False;
DIOCError := GetLastError;
End;

Result := fResult;
End;

// Le routine che seguno accedono ai singoli interrupt
Function IOCTL_CallInt13(Var Reg : DIOC_REGISTERS) : Boolean;
Begin
Result := DoIOCTL(Reg, VWin_Dioc_Dos_Int13);
End;

Function IOCTL_CallInt21(Var Reg : DIOC_REGISTERS) : Boolean;
Begin
Result := DoIOCTL(Reg, VWin_Dioc_Dos_IOCTL);
End;

Function IOCTL_CallInt25(Var Reg : DIOC_REGISTERS) : Boolean;
Begin
Result := DoIOCTL(Reg, VWin_Dioc_Dos_Int25);
End;

Function IOCTL_CallInt26(Var Reg : DIOC_REGISTERS) : Boolean;
Begin
Result := DoIOCTL(Reg, VWin_Dioc_Dos_Int26);
End;

Quindi per prelevare, ad esempio, il numero di serie dell'hard-disk
basta usare una funzione tipo questa che richiama l'interrupt 21
funzione 44(esadecimale)

Function GetDriveSerialNum(Var MID : MIDRec;
Drive : Word) : Boolean;
Var
R : DIOC_REGISTERS;
Begin
R.EAX := $440D;
R.EBX := Drive;
R.ECX := $0866;
R.EDX := DWord(@MID);

If IOCTL_CallInt21(R)
Then
Result := ((R.Flags And flgCarry) = 0)
Else
Result := False;
End;

Per le funzioni dei singoli interrupt cerca in giro e troverai una marea
di documentazione (in Inglese ovviamente)

Ciao,
David
 #3  
12.05.2005, 15:21
Kayn
microges ha scritto:
[cut]

Grazie per la risposta.
Avresti da consigliarmi qualcosa in più in merito a Windows NT/XP?
Kayn.
 #4  
12.05.2005, 15:37
microges
No mi dispiace ma credo che componenti per 2K/NT/XP che facciano questo
siano solo a pagamento in quanto la creazione di un device driver è una
grande scocciatura

Ciao,
David
 #5  
12.05.2005, 16:54
Lis
On Thu, 12 May 2005 16:37:34 +0200, microges wrote:

> No mi dispiace ma credo che componenti per 2K/NT/XP che facciano questo
> siano solo a pagamento in quanto la creazione di un device driver è una
> grande scocciatura


Io cambierei "scocciatura" con "macello". Sono due mesi che stiamo litigando
nel creare un driver per una stampante virtuale e non è per nulla semplice,
il tutto con l'aggiunta che la documentazione, quando c'è ,è molto vaga
:-/
 #6  
12.05.2005, 17:33
Kayn
> Io cambierei "scocciatura" con "macello". Sono due mesi che stiamo litigando
> nel creare un driver per una stampante virtuale e non è per nulla semplice,
> il tutto con l'aggiunta che la documentazione, quando c'è ,è molto vaga
> :-/


Infatti tempo fà presi in mano la documentazione Microsoft per la
creazione di driver, ma mi persi nei meandri delle specifiche.
Grazie cmq per l'aiuto.
 #7  
12.05.2005, 18:36
Setec Astronomy
Lis wrote:

> Io cambierei "scocciatura" con "macello". Sono due mesi che stiamo
> litigando nel creare un driver per una stampante virtuale e non è per
> nulla semplice, il tutto con l'aggiunta che la documentazione, quando
> c'è ,è molto vaga :-/


[url down]

Vuoi supportarmi? [url down]
 #8  
13.05.2005, 09:03
Lis
On Thu, 12 May 2005 17:36:51 GMT, Setec Astronomy wrote:

> [..]


Grazie, questo è lo stesso punto di partenza che abbiamo usato noi, ma è
solo un inizio perchè ci sono vari problemi e abbiamo dovuto fare parecchie
modifiche al print processor e alla procedura di assemblamento degli emf.
Ora, incrociando le dita, sembra funzionare
Discussioni simili
Buffer (void *) a cui accede byte a byte

Nelle mie applicazioni mi ritrovo spesso a dover passare ad una funzione il puntatore ad un buffer in memoria. Come ho visto fare nelle varie funzioni di libreria (vedi...

come posso spostare un byte all'interno di un'altro byte?

mi spiego,ho 2 byte già definiti(tipo:11110000 e 10001000)e voglio che il secondo byte entri parzialmente nel primo occupandone i primi 3 bit ,quindi con un byte risultante...

Confronto di files byte per byte

Come posso confrontare, in java, due file byte per byte, per verificare di avere eseguito un corretto backup di sicurezza ? Grazie

prendere i byte in parole di 2 byte

Salve a tutti. Ho un problema che non so risolvere. Ho bisogno di codificare una sequenza numerica in un'altra sequenza numerica. Mi spiego meglio. Supponiamo di aver...

Byte lettura I/O???

Secondo voi per quale ragione per un programma Visual Basic, che neanche usa librerie di database e legge solo qualche file INI da pochi kbyte, possa risultare da Task...


Tutti gli orari sono GMT. Attualmente sono le 01:42. | Privacy Policy