CD-Laufwerk sperren
-
IO_DEVICE_CTL_Dingsbümsen
Was 'n das ? 
(Google sagte: "Nichts gefunden!")
-
Hi,
Du brauchst CreateFile zum Ermitteln eines Handle's zu Deinem Laufwerk und DeviceIoControl zum steuern. Als Controlcode kannst Du IOCTL_STORAGE_MEDIA_REMOVAL und evtl. noch IOCTL_STORAGE_EJECTION_CONTROL verwenden.
Durch ein bisschen googeln hab ich das gefunden, vllt ist das n Ansatz: http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&article=2442&spider_enabled=
-
ich weiß nicht warum, aber auf russischen seiten gibt es alles^^
void LockDrive() { HANDLE hDevice = CreateFile ("\\\\.\\F:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); DWORD dwBytesReturned = 0; PREVENT_MEDIA_REMOVAL pmr = {true}; DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) CloseHandle (hDevice); } void UnlockDrive () { HANDLE hDevice = CreateFile ("\\\\.\\F:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); DWORD dwBytesReturned = 0; PREVENT_MEDIA_REMOVAL pmr = {false}; DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) CloseHandle (hDevice); }mir war gerade langweilig, aber es funzt
Mfg Ominion
EDIT: habe das jetze noch ein bisschen optimiert, vllt. könnte man die Funktion ja noch in die FAQ zusammen mit öffnen und schließen von nem Laufwerk stellen:
bool LockDrive (char cDrive, bool bLock) { char lpDrive [10]; bool bLocked = true; wsprintf (lpDrive, "\\\\.\\%c:", cDrive); HANDLE hDevice = CreateFile (lpDrive, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); unsigned long dwBytesReturned = 0; PREVENT_MEDIA_REMOVAL pmr = {bLock}; if (!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) bLocked = false; CloseHandle (hDevice); return bLocked; }
-
Joar die Russen haben allet^^, wenn Du gestattest, bringe ein paar kleine Verbesserungen/Ergänzungen rein:
// Parameter: chDriveID > Laufwerkbuchstaben, fLock > true/false, lock/unlock // Return-Wert: true > Aufruf erfolgreich, false > Aufruf fehlerhaft bool ModifyDriveLock(TCHAR chDriveID, bool fLock) { TCHAR szAddress[] = { TEXT('\\'), TEXT('\\'), TEXT('.'), TEXT('\\'), chDriveID, TEXT(':') }; HANDLE hDevice = CreateFile(szAddress, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); if(hDevice == INVALID_HANDLE_VALUE) return (false); DWORD dwBytesReturned = 0L; PREVENT_MEDIA_REMOVAL pmr = { fLock }; bool fSuccess = static_cast<bool>(DeviceIoControl(hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)); CloseHandle (hDevice); return (fSuccess); }EDIT: Meine ist besser :p .
-
Den cast kannste dir sparen, wenn du das so machst wie ich, und ob unsigned long oder DWORD ist auch egal, ansonsten die Klammern beim return, is zwar nicht so schlimm, aber geht ja auch ohne und ob 0L oder 0 ist bisher auch noch egal. Ansonsten die Überprüfung ob das Handle angelegt werden konnte ist Jacke wie Hose, da das spätestens beim Versuch das zu locken bemerkt wird. So, nachdem ich kein gutes Haar mehr an deiner Version gelassen habe, muss ich noch hinzufügen, dass das mit TCHAR besser ist als mit wsprintf, da man sich nen Funktionsaufruf spart...
Mfg Ominion
EDIT: ich würde ja fast sagen unentschieden, aber wegen TCHAR haste doch gewonnen...

-
Naja, meins ist zeichensatz-unabhängig
.
-
Vielen Dank für die vielen Antworten.
Doch so richtig klappts noch nich:
ModigyDriveLock lockt nichts, aber bei LockDrive klappts!
Doch bei gar keiner Variante kann ich mein Laufwerk wieder entsperren!!!
Ich krieg mein Laufwerk nicht mehr auf!!
Helft mir!!!

-
du musst bei mir bLock auf false setzen, falls du es nicht gemacht hast
Mfg Ominion
EDIT: tja CodeFinder, bei mir klappt es auch nicht...ich glaube die Medaille geht diesesmal an mich

-
Das hab ich gemacht, aber es passiert trotzdem nichts!!!!
-
also haste das so gemacht:
LockDrive ("F", false);oder so
LockDrive ('F', false);also bei mir klappt es mit der 2. Variante
Mfg Ominion
EDIT: sry war quatsch, er spuckt ja nen error beim compilieren aus, wenn du das nach 1. machst.
-
OT: ich stehe gerade total auf nem schlauch. wie kann ich ein char* in char umwandeln?= mit (char), lpChar[0], wsprintf oder cChar = lpChar[0] geht es nicht.
Mfg Ominion
-
Hey Ominion,
deine Fkt. klappt doch, war wohl mein Fehler.
Aber ich wüsste gern mal, warum die ModifyDriveLock nict funzt.
Ich habe es getestet: Die ModifyDriveLock gibt immer false zurück. Warum?
-
Mir fällt grad noch was ein:
Kann man alle Laufwerksbuchstaben der CD-Laufwerke ermitteln?
-
naja, ich habe gerade in den einem topic nen link zu nem tutoril gepostet, da war das glaube ich mit drin, das war wie lerne ich richtig winapi oder so
Mfg Ominion
-
Kannste mir den Link geben?
-
-
Danke.

-
Und was ist, wenn CD-Laufwerke keinen Laufwerksbuchstaben haben, sondern in irgendein NTFS-Verzeichnis gemountet wurden?
-
Na dann musst du dir was einfallen lassen

Mfg Ominion
-
Das Tutorial ist recht gut, Ominion
Und ich hab auch das mit den laufwerken gefunden.
Aber das hilft mir irgendwie nicht. Haste noch ne andere Idee?