Von Thomas Hölzer am 27 April, 1998 um 02:22:15:
Die Neugier hat schließlich über die Angst triumphiert (siehe früheren Beitrag zum Thema), und siehe da,
es geht doch - sogar ganz ohne Abstürze beim Ausprobieren!
Mit diesem Code läßt sich die Seriennummer eines
Datenträgers NUR unter Windows 95 (nicht NT !!) und nur
mit Profan32 schreiben ( ein Listing für NT wird folgen).
Nebenbei ein kleines Beispiel dafür, wie DOS-Interrupts mitten im 32 Bit-Land nach wie vor munter ihr Wesen treiben.
Es funktioniert bei mir mit sämtlichen Festplatten und dem ZIP-Drive, die jetzt alle die Seriennummer 12345 haben ;-(, weil ich blöderweise die alte Seriennummer vorher nicht ermittelt und notiert habe!
Beim Diskettenlaufwerk scheint die Funktion nur etwas zu bewirken, wenn das Medium bereits eine Seriennummer hat. Jedenfalls meldet die Funktion bei mir bei werksfrisch formatierten Disketten ohne
Seriennummer zwar Vollzug und das LW schnurrt, anschließend läßt sich aber trotzdem nichts lesen. Nach normaler Formatierung unter Win95 geht es dann
auf einmal doch. Keine Ahnung, warum.
Bitte unbedingt beachten:
Dieser Code arbeitet ohne Netz und doppelten Boden und sollte keinesfalls in Programmen "einfach mal so eingesetzt" werden, schon gar nicht in solchen,
die auf die Öffentlichkeit losgelassen werden.
Man/frau sollte auch wirklich genau wissen, was er/sie tut und ansonsten wirklich lieber die Finger davon lassen!
Der Code dient lediglich zu Demonstrationszwecken und wird von mir ohne jegliche Gewähr zur Verfügung gestellt. Jede/r, der/die ihn einsetzt, handelt auf eigene Gefahr! Residente Virenwächter werden übrigens Alarm schlagen (mein NAV 4.0 tuts jedenfalls).
Die aktuelle Einstellung im Listing gilt für Laufwerk A: (also bitte vorher eine Diskette einlegen und ggf. Schreibschutz entfernen!)
MfG
Thomas
DEF CloseHandle(1) !"KERNEL32","CloseHandle"
DEF CreateFile(7) !"KERNEL32","CreateFileA"
DEF DeviceIoControl(8) !"KERNEL32","DeviceIoControl"
Cls
Declare VWIN32_DIOC_DOS_IOCTL%
Let VWIN32_DIOC_DOS_IOCTL% = 1 ' DOS-Interrupt 21
Declare Vxd&,Device#,REGISTERS#,MediaData#,InOutput#
Dim Device#,14
Dim Registers#,28
Dim MediaData#,8
Dim InOutput#,4
String device#,0=ADD$("\\\\.\\vwin32",Chr$(0))
Let Vxd&=CreateFile(Device#,40000000,3,0,3,128,0)
' Virtuellen Gerätetreiber ansprechen (*vwin32 ist intern in vmm32.vxd)
' Print Vxd&, "= VXD-Handle"
Long MediaData#,2=12345 ' die Seriennummer
Long Registers#,12=$440D ' EAX - DOS-Funktion
Long Registers#,0=1 ' EBX - Das Laufwerk (0=Aktuelles, 1 = A:,3=
C: usw.)
Long Registers#,8=$46 ' ECX - Unterfunktion (Set Media ID)
Long Registers#,4=MediaData# ' EDX - Struktur mit Datenträgerinfos
IF Equ(0,\
DeviceIoControl(Vxd&,VWIN32_DIOC_DOS_IOCTL%,Registers#,28,\
Registers#,28,Mediadata#,0))
print "Fehler!"
Else
print "Seriennummer geschrieben für Disk",
Chr$(Add(Long(Registers#,0),64));":"
EndIf
CloseHandle(Vxd&)
Dispose Device#
Dispose Registers#
Dispose MediaData#
Dispose InOutPut#
WaitInput