Autor Beitrag
CrazyLuke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 247

Windows XP Pro
Turbo Delphi Explorer, D2005 PE
BeitragVerfasst: Fr 27.08.04 19:33 
Hi!

Ich habe ein ganz komisches Phänomen.

Ich habe bei MS folgendes gelesen:
support.microsoft.com/?id=330135

Nun habe ich mal alle Möglichkeiten ausprobiert und nach jedr Einstellung (mit Neustart) die CDs mehrmals ein- und ausgefahren. Das Ergebnis:

Beides deaktiviert:
CD/DVD-Laufwerke werden nur bei explizitem Aufruf aktualisiert.

Beides aktiviert:
CD/DVD-Laufwerke werden immer im aktuellen Zustand angezeigt (inkl. Medium-Titel), Disks starten selbstständig.

Nur HKLM aktiviert:
CD/DVD-Laufwerke werden immer im aktuellen Zustand angezeigt (inkl. Medium-Titel)

Nur HKCU aktiviert:
CD/DVD-Laufwerke werden immer im aktuellen Zustand angezeigt (inkl. Medium-Titel), zusätzlich AutoPlay übers Kontextmenü nachträglich startbar.


Ich habe also den HKCU-Schlüssel zusätzlich in M.I.B. eingebaut. Jedoch hat er den Wert 0xb5 nicht angenommen (da mit Buchstaben). Also hab ich in der Registry geschaut, as das Dezimal.Pendant ist und dieses verwendet. Diese Werte werden auch korrekt in die Registry eingetragen. Doch seitdem ich die Einstellung mit M.I.B. geändert habe, reagiert ausgerechnet meine Lieblingseinstellung (Nur HKCU aktiviert) ganz anders, nämlich als wenn beides deaktiviert wäre :-(

Ich habe nochmal geschaut und mir ist aufgefallen, dass beim Reinkopieren von 0xb5 in die Registry dieses nach dem Umschalten nach Dezimal und zurück in 41b5 umgewandelt wird. Ich habe es dann nochmal selber manuell reingetippt und er hat als Dezimalwert nun nicht 16821 sondern 181 ausgegeben.

Anscheinend hatte sich da MS etwas umständlich ausgedrückt: Der einzugebene HD-Wert lautet nämlich nur b5, der komplette Wert 0x000000b5 !

Ich habe einige Neustarts mit manuellem Umändern in der Reg hinter mir, aber bisher habe ich meine Lieblingsfunktion nicht mehr zum Leben erwecken können :-(

War das ein einmaliges Phänomen oder liegt da ein Fehler meinerseits vor?

War es denn richtig, dass ich den Dezimalwert angegeben habe?


Hier der Code:

Prüfen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button12Click(Sender: TObject);
var
  Reg: TRegistry;
  RegKey: DWORD;
  Key: string;
begin
  reg := TRegistry.Create(KEY_READ);
  try
    Reg.RootKey :=  HKEY_CURRENT_USER;
    Key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer';
    if Reg.OpenKeyReadOnly(Key) then
      if Reg.ValueExists('NoDriveTypeAutoRun'then
        RegKey := Reg.ReadInteger('NoDriveTypeAutoRun');
        Reg.CloseKey;
    if (RegKey=145then Edit3.Text:=' AutoPlay ist noch aktiv!'
      else Edit3.Text:=' AutoPlay ist bereits deaktiviert.';
    Button16.Enabled:=(RegKey=145);
    Button17.Enabled:=(RegKey=181);
    finally
    Reg.Free
  end;
end;


Deaktivieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button16Click(Sender: TObject);
var
  Reg: TRegistry;
  RegKey: DWORD;
  Key: string;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    Key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer';
    if Reg.OpenKey(Key, True) then
      Reg.WriteInteger('NoDriveTypeAutoRun'181);
      Reg.CloseKey;
  finally
    Reg.Free;
end;
ShowMessage('Klicken Sie auf ''Jetzt prüfen'', um zu testen, ob die Änderung geklappt hat.');
end;


Aktivieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button17Click(Sender: TObject);
var
  Reg: TRegistry;
  RegKey: DWORD;
  Key: string;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    Key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer';
    if Reg.OpenKey(Key, True) then
      Reg.WriteInteger('NoDriveTypeAutoRun'145);
      Reg.CloseKey;
  finally
    Reg.Free;
    end;
    ShowMessage('Klicken Sie auf ''Jetzt prüfen'', um zu testen, ob die Änderung geklappt hat.');
end;
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 27.08.04 23:27 
Ich habe die Sache nur kurz überflogen, aber --

CrazyLuke hat folgendes geschrieben:
Anscheinend hatte sich da MS etwas umständlich ausgedrückt: Der einzugebene HD-Wert lautet nämlich nur b5, der komplette Wert 0x000000b5 !

Ist das nicht das gleiche? Okay, es kommt darauf an, welchen Typ du benutzt. Ein Byte würde eben nur als 0xb5 gespeichert werden. Ein Word dagegen schon als 0x00b5. Ein DWord dann eben 0x000000b5.

Zitat:
War es denn richtig, dass ich den Dezimalwert angegeben habe?

Du hättest auch $000000b5 benutzen können. Wichtig ist nur, dass du den Typ beachtest. Wenn ich das richtig im Kopf habe (habe ja selbst mal ein Tool geschrieben, dass diesen Wert ändern kann ;)), dann ist es unter 2000/XP ein DWord, unter 95/98 allerdings ein binärer Wert.

Abgesehen davon setzt sich dieser Wert ja noch aus anderen Daten zusammen. Das heißt, bei dir mag in der Registry vllt. 0x000000b5 stehen. Ein anderer hat aber evtl. ein anderes Flag gesetzt, und bei ihm stimmt zumindest der erwartete Wert nicht.
Es wäre daher zweckmäßig, wenn du nicht den kompletten Wert sondern nur ein bestimmtes Bit prüfst. Ich habe mal eben (während die Vorschau erzeugt wurde :)) besagtes Tool von mir rausgekramt, und da steht´s wie folgt drin:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
            if(AutorunSettings <> 0then
            begin
              ndtar := CreatePopupMenu;
              AppendMenu(ndtar,MF_STRING or
                ARFlags[(AutorunSettings and  1) =  1],
                CM_ARUNKNOWN,'unbekannte Laufwerke');
              AppendMenu(ndtar,MF_STRING or
                ARFlags[(AutorunSettings and  2) =  2],
                CM_ARNOROOT,'Root');
              AppendMenu(ndtar,MF_STRING or
                ARFlags[(AutorunSettings and  4) =  4],
                CM_ARREMOVABLE,'wechselbare Laufwerke');
              AppendMenu(ndtar,MF_STRING or
                ARFlags[(AutorunSettings and  8) =  8],
                CM_ARFIXED,'festeingebaute Laufwerke');
              AppendMenu(ndtar,MF_STRING or
                ARFlags[(AutorunSettings and 16) = 16],
                CM_ARREMOTE,'Netzlaufwerke');
              AppendMenu(ndtar,MF_STRING or
                ARFlags[(AutorunSettings and 32) = 32],
                CM_ARCDROM,'CD-ROM Laufwerke');
              AppendMenu(ndtar,MF_STRING or
                ARFlags[(AutorunSettings and 64) = 64],
                CM_ARRAMDISK,'RAM-Disk');

              AppendMenu(hm,MF_POPUP,DWORD(ndtar),'Autostart aktivieren für');
            end;


Inwieweit der Typ (Binär vs. DWord) bei der Registry-Unit nun eine Rolle spielt, kann ich dir nicht sagen. Mit den API-Aufrufen von Windows hat´s mich nicht interessiert, ob der Eintrag als Binärwert oder als DWord gespeichert wurde.

Hier mein Zitat aus Luckies Tutorials zum gleichen Thema:
Zitat:
Normalerweise ist dieser Wert "0x00000095". Daher startet z.B. ein Programm automatisch, sobald Sie eine CD-ROM einlegen (sofern die CD entsprechend ausgerüstet ist, natürlich!). Würden Sie den Wert auf "0x000000b5" ändern, wäre der Autostart der CDs unterbunden. Das Interessante an diesem Wert ist, dass er unter Windows 98 als Binärwert gespeichert ist, unter Windows XP jedoch als dword.

Das ändert nun aber nichts am Prinzip; wir müssen lediglich das Betriebssystem prüfen und den passenden Typ vergleichen. Zum Auslesen selbst können wir in beiden Fällen eine dword-Variable benutzen, da ja auch die binäre Form (Win98) nur 4 Bytes groß ist. Das funktioniert, weil der Binärwert (wie in einer typischen Datei unter Windows) mit dem niederwertigen Byte zuerst gespeichert wird. [...]

usw. ;)
CrazyLuke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 247

Windows XP Pro
Turbo Delphi Explorer, D2005 PE
BeitragVerfasst: Sa 28.08.04 11:58 
Hi!

1. Ist denn wenigstens mein Code (für XP) richtig?
2. Auch wenn ich 95 (Lucky) statt 91 (Microsoft) verwende, passiert nix. :(