Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Enumeracija HKLM > System > CurrentControlSet > Services

[es] :: C/C++ programiranje :: Enumeracija HKLM > System > CurrentControlSet > Services

[ Pregleda: 2347 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

de_c0der

Član broj: 127698
Poruke: 107
*.adsl.net.t-com.hr.



Profil

icon Enumeracija HKLM > System > CurrentControlSet > Services01.04.2007. u 12:04 - pre 207 meseci
Trebam izlistat sve drajvere/service iz:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

... i to radim preko RegEnumKeyEx no ona nakon prvog pozivanja vrati u redu, a nakon drugog ERROR_MODE_DATA
a SubkeyName je 256 karaktera i nema duljeg naziva od toga... u cem je onda problem????

Code:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;


int main(int argc, char *argv[])
{
    HKEY hKey;
    char SubkeyName[256];
    DWORD dwSize=256;

    
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services", 0, KEY_ALL_ACCESS, &hKey)!=ERROR_SUCCESS)
                 { cout<<"debilni problem broj 1!!!!!"<<endl;
                   return 0; }
                   
    int i=0;
    int ret=0; //ERROR_SUCCESS
    while(ret==ERROR_SUCCESS)
          {
            ret=RegEnumKeyEx(hKey, i++, SubkeyName, &dwSize, NULL, NULL, NULL, NULL); 
            cout<<SubkeyName<<endl;
          }    
    cout<<ret<<endl; //javlja ERROR_MORE_DATA
       
    RegCloseKey(hKey);
    system("PAUSE");
    return EXIT_SUCCESS;
}


Ovo je ispis toga:
Abiosdsk
abp480n
234 //to je ret koji je vratio
Press any key to continue . . .


ja ne znam ko je tu glup


[Ovu poruku je menjao X Files dana 01.04.2007. u 13:26 GMT+1]
 
Odgovor na temu

de_c0der

Član broj: 127698
Poruke: 107
*.adsl.net.t-com.hr.



Profil

icon Re: Enumeracija HKLM > System > CurrentControlSet > Services01.04.2007. u 12:30 - pre 207 meseci
Rjesio sam prob.. o kako su debilni, kako su glupo napravili implemntaciju apija da je to prestrasno... ovdje je usrana greska bila:
Code:

    while(ret==ERROR_SUCCESS)
          {
            ret=RegEnumKeyEx(hKey, i++, SubkeyName, &dwSize, NULL, NULL, NULL, NULL); 
            cout<<SubkeyName<<endl;
          }   


Zato sto je RegEnumKeyEx tako pametna fja da mora svaki put mjenjat dwSize parametar kao da ja sam ne znam izracunat kolko subkey name ima karaktera iako to nikom nije potrebno, znaci treba

Code:

    while(ret==ERROR_SUCCESS)
          {
            ret=RegEnumKeyEx(hKey, i++, SubkeyName, &dwSize, NULL, NULL, NULL, NULL); 
            cout<<SubkeyName<<endl;
            dwSize=255; /*ovo je dodano, 255 je maks. subkey name, al je*bem ti sta moraju bit tako debilni?
                               znaci ako subkeyeva ima 10 000 onda ce zbog glupog parametra kojeg jos gluplja fja mjenja program izvrsavat
                              10 000 instrukcija vise, a to je jakaaa MS optimizacija, nabijem sve to....*/
          }   


pozdrav... ne mogu vjerovat kako me tako nesto uspije nazivcirat
 
Odgovor na temu

de_c0der

Član broj: 127698
Poruke: 107
*.adsl.net.t-com.hr.



Profil

icon Re: Enumeracija HKLM > System > CurrentControlSet > Services01.04.2007. u 13:44 - pre 207 meseci
Lol, ajde kad sam vec zapoceo temu da bude u njoj nesto i korisno.. evo vam primjer koda kako radit sa drajverima, servisima:

Code:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;


int main(int argc, char *argv[])
{
    int izbor;
    cout<<"Welkom tu d de_c0der drajver aplikejshn, chuz:"<<endl;
    cout<<"1-za listanje drajvera/servisa"<<endl<<"2-za pokretanje drajvera/servisa"<<endl
        <<"Vas izbor:";  cin>>izbor;
 if (izbor==1)
 {  
    HKEY hKey, hSubKey;
    char SubkeyName[255], szValueName[16383], szValueData[200];
    DWORD dwSize=255, dwValueSize=16383, dwValueDataSize=200;
    DWORD dwValueType;
    
    
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services", 0, KEY_READ, &hKey)!=ERROR_SUCCESS)
                 { cout<<"Problem broj 1!!!!!"<<endl;
                   return 0; }
                   
    DWORD i=0, iSubKeyMaloDeristeDaTakoIzgledajuKratkiParametriMeniNijeDosadno=0;
    while(RegEnumKeyEx(hKey, i++, SubkeyName, &dwSize, NULL, NULL, NULL, NULL)==ERROR_SUCCESS)
          {
            dwSize=255;
            cout<<i<<".)"<<SubkeyName<<endl;
            
            RegOpenKeyEx(hKey, SubkeyName, 0, KEY_READ, &hSubKey);
            iSubKeyMaloDeristeDaTakoIzgledajuKratkiParametriMeniNijeDosadno=0;
            //Idemo izlistat Value-e tako da znamo o kakavom drajveru/servisu se radi
               while(RegEnumValue(hSubKey, iSubKeyMaloDeristeDaTakoIzgledajuKratkiParametriMeniNijeDosadno++,
                     szValueName, &dwSize, NULL, NULL, NULL, NULL)==ERROR_SUCCESS)
               {
                dwSize=255; //ovo smo naucili iz prosle greske :)
                RegQueryValueEx(hSubKey, szValueName, 0, &dwValueType, (PBYTE)szValueData, &dwValueDataSize);
               if (dwValueType==4) 
                      {
                       int podatak=atoi(szValueData); 
                       cout<<"    ->"<<szValueName<<":"<<podatak<<endl;            
                      } else cout<<"    ->"<<szValueName<<":"<<szValueData<<endl;
                
               }
            
          }    
       
    RegCloseKey(hKey); 
    
 } else if(izbor==2) {char putanja[100]; //stack buffer overflow al koga briga
                      cout<<"Upisi putanju do drajvera:"<<endl;
                      cin>>putanja; //BO
                          HANDLE hSCManager;
                          HANDLE hService;
                          SERVICE_STATUS ss;

                          hSCManager = (SC_HANDLE)OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
    

    if(hSCManager)
    {

        hService = (SC_HANDLE) CreateService((SC_HANDLE) hSCManager, "Probni", "Probni primjer", SERVICE_START | DELETE | SERVICE_STOP, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE,
                                   putanja, NULL, NULL, NULL, NULL, NULL); //putanja npr. je C:\probni.sys

        if(!hService)
        {
            hService = (SC_HANDLE)OpenService((SC_HANDLE)hSCManager, "Probni", SERVICE_START | DELETE | SERVICE_STOP);
        }

        if(hService)
        {

            cout<<"Startamo ga.."<<endl;
            StartService((SC_HANDLE)hService, 0, NULL);
            printf("Pritisni enter da ga zatvorimo\r\n");
            getchar();
            ControlService((SC_HANDLE)hService, SERVICE_CONTROL_STOP, &ss);

            CloseServiceHandle((SC_HANDLE)hService);

            DeleteService((SC_HANDLE)hService);
        }

        CloseServiceHandle((SC_HANDLE)hSCManager);
    }
                      } else cout<<"Nepostojeca opcija"<<endl;

    

    system("PAUSE");
    return EXIT_SUCCESS;
}



U attachu imate probni drajver u slucaju da nemate skinut DDK, evo i koda:
Code:

#include <ntddk.h>

void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
    DbgPrint("Drajver odlazi doma..\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
    DriverObject->DriverUnload = DriverUnload;
    
    DbgPrint(*RegistryPath);
    DbgPrint("Welcome to my world.. :)");
    
    return STATUS_SUCCESS;
}



Znaci StartService preko SCM handle-a poziva DriverEntry rutinu :)

pozdrav



edit:
ako drajver ima bug i SERVICE_BOOT_START flag Start mu je postavljen onda ce komp se prebacit u LKGC (last known good configuration) a ako je vec u LKGC-u onda ce nastavit bootat pa kud puklo da puklo ukoliko ErrorControl flag nije postavljen na critical jer u tom slucaju se pojavljuje blue screen of deadth :D .. znaci ako netko zeli vidjet kako taj screen izgleda nek napise neki supalj drajver, tj. ne mora bit supalj, dovoljno da prepise odredjen dio neke bitne memorije i da se izmjeni HKLM\... LKGC settings za loadanje drajvera prilikom boota, zatim resetirajte i to bi bilo to ;D
Prikačeni fajlovi
 
Odgovor na temu

[es] :: C/C++ programiranje :: Enumeracija HKLM > System > CurrentControlSet > Services

[ Pregleda: 2347 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.