[C++] odczyt plikow rejestru Windows XP

0

Witam,
jak wiadomo rejestr systemu Windows XP sklada sie z kilku plikow, ktore w momencie uruchamiania/logowania uzytkownika lacza sie w jedna calosc i tworza rejestr. Lokalizacje poszczegolnych plikow mozna znalezc w kluczu HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\HiveList. HiveList zawiera wpisy lokalizację katalogu rejestru (nazwa wpisu) oraz fizyczną lokalizację katalogu (jako wartość wpisu).

Jednak przy probie odczytania tego pliku (oczywiscie mowa o programie uruchamianym z konta administratora), pojawia sie problem... Funkcja good() zwraca false. Zgodnie z dokumentacja - zwraca ona taka wartosc w przypadku, kiedy plik nie istnieje na dysku lub gdy brak jest uprawnien do otwarcia tego pliku...
Ponizej przedstawiam fragment kod, ktory uzylem:

fstream plik("\Device\HarddiskVolume1\Documents and Settings\LocalService\NTUSER.DAT",std::ios::in|std::ios::binary);
   fstream plik1("c:/rejestr1.dat",std::ios::out|std::ios::binary);
   if (plik.good()==0)
   {
      printf("ZONK");
      getch();
   }
   plik.seekg (0, ios::end);
   int length = plik.tellg();
   plik.seekg (0, ios::beg);

   char *buffer = new char [length];
   plik.read (buffer,length);

   cout.write (buffer,length);
   plik1.write(buffer,length);

   plik.close();
   plik1.close();

   plik.write (buffer,length);

   delete[] buffer;

Kod oczywiscie jak na razie tylko prowizoryczny - praktycznie bez zadnych zabezpieczen.
Moje pytanie jest takie - w jaki sposob skopiowac (chodzi glownie o odczyt, bo jesli bedzie w buforze, to po problemie) taki plik. Czy obedzie sie bez wstawki asemlerowej? Bo z asemblerem stoje jak na razie srednio. A moze ktos wrzuci kod w asemblerze, ktory zrobilby te robote. Moze jakies inne pomysly...

Bede wdzieczny za kazda podpowiedz.
Pozdrawiam.

0

Na razie kod prowizoryczny na tyle, że ukośniki w nim są spieprzone ;p zamień na \

Poza tym, nie wiem, jak przełknięte to zostanie:
\Device\HarddiskVolume1\
na razie przynajmniej na czas testów walnąłbym zamiast tego po prostu literę dysku, ale to mogą być sztuczne obawy.

Na twoim miejscu samo kopiowanie realizowałbym też funkcją CopyFile, a nie iostreamami.

Sam nic sprawdzić z pewnych przyczyn nie mogę, więc z ciekawością poczekam, czy to same ukośniki robiły problem... Może się zrobić ciekawie, jeśli system tego pliku jednak broni, i będzie trzeba o niego walczyć :)

0

1' sciezka w stylu \device\harddiskvolume1\blah jest poprawna, tak to wyglada w WinNT, tylko potem jest mapowane na litery C:, D: itp
2' konkretna sciezka fstream plik("\Device\HarddiskVolume1 jest cholernie NIE poprawna, poniewaz slashe tworza escape sequences. poprawilem kolorowanie skladni - widac to teraz wyraznie. slashe trzeba dawac podwojnie np.("\Device\HarddiskVolume1\..
3' assembler Ci nic nie pomoze. NTUSER.DAT jest plikiem zawsze otwartym przez system i jest on hm.. 'zatrzasniety' tak samo jak PAGEFILE.SYS itp. szczesliwie - tylko NTUSER.DAT aktualnie zalogowanego uzytkownika jest blokowany, inne mozna ruszac. tak wiec, aby go skopiowac - musisz odpalic swoj program pod innymi credentialami, wylogowac aktualnego uzytkownika, skopiowac plik, zalogowac usera z powrotem

0

Z tymi slashami, to glupi blad strzelilem (ale pozna godzina byla;)). Mimo wszystko poprawienie na podwojne slashe w zasadzie nic nie zmienilo (poza poprawnoscia kodu oczywiscie) - mowa o zmianach w dzialaniu programu.

Jesli chodzi o CopyFile, to niestety (programik ma miec rowniez opcje przesylania plikow przez siec).

Czyli C++ nie poradzi sobie z dostaniem sie do zablokowanego pliku? Co do manewrow z omowionych manewrow z logowaniem, to nie ma za bardzo takiej mozliwosci...

A znacie moze biblioteki, ktore pozwola na operacje na rejestrze? Chodzi glownie o odczyt. Obilo mi sie o uszy cos o ich istnieniu...

Dzieki za szybka pomoc.
Pozdrawiam.

0

da rade sobie poradzic, ale az tak nisko nie chcesz schodzic.. nie ruszysz w zaden normalny sposob tych plikow, poki sa uzywane i koniec.

pozwola na operacje na rejestrze?

wiesz.. sporo mnie ten watek nerwow kosztowal, mam nadzieje ze nie pytasz o to o co zapytales teraz.. google+"windows registry API", pierwszy link i juz masz mase funkcji..

0

do odczytu i modyfikacji rejestru sa odpowiednie funkcje WinAPI, polecam Google i MSDN - tam wszystko napisane z przykladami jest, np http://msdn2.microsoft.com/en-us/library/ms724871(VS.85).aspx

0

a jak chcesz eksportowac cały rejestr za jednym zamachem, to możesz też zainteresować się wpisaniem w konsoli "reg /?"
...

1 użytkowników online, w tym zalogowanych: 0, gości: 1