Tag: SO2 – 2021 – Ficha 2 v.2.7.pdf

sessão 2 – Criar, consultar, alterar e remover chaves do Registry.

Bibliografia de apoio:
Capítulo 3 do Livro Windows System Programming (da Bibliografia) (pags. 86-97)
MSDN:
Registry Functions: https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-functions
32-bit and 64-bit Application Data in the Registry: https://docs.microsoft.com/en-us/windows/win32/sysinfo/32-bit-and-64-bit-application-data-in-the-registry?redirectedfrom=MSDN

Criação de processo e espera até terminar:

TCHAR comando[TAM] = TEXT("notepad-exe ficheiro.txt");
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);

if (CreateProcess(NULL, comando, NULL, NULL, 0, 0, NULL, &si, &pi)
{
	_tprintf(TEXT("processo com PID: %d foi lançado"), pi.dwProcessId);
	WaitForSingleObject(pi.hProcess, INFINITE);
}

O editor do registry: registry editor (regedit)
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE (só admin, todos os programas que são instalados)

Para criar fica assim:

#include <windows.h>
#include <tchar.h>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>

#define TAM 200

int _tmain(int argc, TCHAR* argv[]) {
    HKEY chave; //handle para a chave depois de ser aberta/criada
	//caminho e nome da chave é criada SOFTWARE\\SO2\\chaveLab, uso da contrabarra "\\"
    TCHAR chave_nome[TAM] = TEXT("SOFTWARE\\SO2\\chaveLab"), par_nome[TAM], par_valor[TAM];
    DWORD resultado; //com o que aconteceu com a chave

#ifdef UNICODE 
    _setmode(_fileno(stdin), _O_WTEXT);
    _setmode(_fileno(stdout), _O_WTEXT);
    _setmode(_fileno(stderr), _O_WTEXT);
#endif

	//para criar ou abrir uma chave do registry
    //RegCreateKeyEx retorna um valor se a chave foi criada/aberta com sucesso
    if(RegCreateKeyEx(
        //HKEY                        hKey,
        HKEY_CURRENT_USER,
        //nome da chave
        //LPCTSTR                     lpSubKey,
        chave_nome,
        //DWORD                       Reserved,
        0,
        //LPTSTR                      lpClass,
        NULL,
        //DWORD                       dwOptions, longevidade da chave
        REG_OPTION_NON_VOLATILE,
        //REGSAM                      samDesired,
        KEY_ALL_ACCESS,
        //const LPSECURITY_ATTRIBUTES lpSecurityAttributes, segurança da chave
        NULL,
       // PHKEY                       phkResult,
        &chave,
        //LPDWORD                     lpdwDisposition
        &resultado
    ) != ERROR_SUCCESS)
    {
        _tprintf(TEXT("chave não foi criada nem aberta! ERRO!"));
        return -1;
    }
	
    if(resultado == REG_CREATED_NEW_KEY)
    {
        _tprintf(TEXT("a chave foi criada: %s"), chave_nome);
    }else
    {
        _tprintf(TEXT("a chave foi criada: %s"), chave_nome);
    }
    RegCloseKey(chave); //importante: fechar sempre o Handle da chave 
    return 0;
}


Os atributos de uma chave são: nome, tipo, e valor

#include <windows.h>
#include <tchar.h>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>

#define TAM 200

int _tmain(int argc, TCHAR* argv[]) {
    HKEY chave; //handle para a chave depois de ser aberta/criada
	//caminho e nome da chave é criada SOFTWARE\\SO2\\chaveLab, uso da contrabarra "\\"
    TCHAR chave_nome[TAM] = TEXT("SOFTWARE\\SO2\\chaveLab");
    TCHAR par_nome[TAM] = TEXT("1º atributo");
	TCHAR par_valor[TAM] = TEXT("É o novo valor");
    DWORD resultado; //com o que aconteceu com a chave

#ifdef UNICODE 
    _setmode(_fileno(stdin), _O_WTEXT);
    _setmode(_fileno(stdout), _O_WTEXT);
    _setmode(_fileno(stderr), _O_WTEXT);
#endif

	//para criar ou abrir uma chave do registry
    //RegCreateKeyEx retorna um valor se a chave foi criada/aberta com sucesso
    if(RegCreateKeyEx(
        //HKEY                        hKey,
        HKEY_CURRENT_USER,
        //nome da chave
        //LPCTSTR                     lpSubKey,
        chave_nome,
        //DWORD                       Reserved,
        0,
        //LPTSTR                      lpClass,
        NULL,
        //DWORD                       dwOptions, longevidade da chave
        REG_OPTION_NON_VOLATILE,
        //REGSAM                      samDesired,
        KEY_ALL_ACCESS,
        //const LPSECURITY_ATTRIBUTES lpSecurityAttributes, segurança da chave
        NULL,
       // PHKEY                       phkResult,
        &chave,
        //LPDWORD                     lpdwDisposition
        &resultado
    ) != ERROR_SUCCESS)
    {
        _tprintf(TEXT("chave não foi criada nem aberta! ERRO!"));
        return -1;
    }
	
    if(resultado == REG_CREATED_NEW_KEY)
    {
        _tprintf(TEXT("a chave foi criada: %s"), chave_nome);
    }else
    {
        _tprintf(TEXT("a chave foi aberta: %s"), chave_nome);
    }
    //criar oar nomeatributo = valor (1 por cada chamada da função)
    if(RegSetValueEx(
        //HKEY       hKey,
        chave,
        //LPCSTR     lpValueName,
        par_nome,
        //DWORD      Reserved,
        0,
        //DWORD      dwType, //tipo: string (REG_SZ), inteiro (REG_WORD), bloco de bytes (REG_BINARY)
        REG_SZ,
        //const BYTE * lpData, //ponteiro para void, dá para tudo como o malloc
        (const LPCBYTE /*igual c const BYTE **/) par_valor,
        //DWORD      cbData
        sizeof(TCHAR) * (_tcsclen(par_valor)+1)
        //+1 para o /0, para ler o /0 
    ) != ERROR_SUCCESS)
    {
        _tprintf(TEXT("Atributo %s não foi alterado nem criado ERRO\n"), par_nome);
    }
    //concatenar qq tipos de dados e guardar numa string
	//_strpintf_s (par_valor, TAM, TEXT("%s %d"), par_nome, tamanho);

	
	//consultar valor de um atributo
    //strcpy(par_nome, TEXT("2º atributo ")); //-> caso fosse necessário escrever a string em c depois de criada
    par_valor[0] = '\0';
	DWORD tamanho = sizeof(par_valor);
	if(RegQueryValueEx(
       // HKEY     hKey,
       chave,
       // LPCTSTR  lpValueName,
       par_nome,
        //LPDWORD  lpReserved, //é para consulta fica a NULL
        0,
        //LPDWORD  lpType,
        NULL,
        //LPBYTE   lpData,
        (LPCBYTE)par_valor,
        //LPDWORD  lpcbData
        &tamanho
    ) != ERROR_SUCCESS)
	{
        _tprintf(TEXT("Atributo %s não foi encotnrado!! ERRO\n"), par_nome);
	}else
	{
        _tprintf(TEXT("Atributo encontrado com o valor: %s e tamanho %d"), par_valor, tamanho);
	}

    DWORD valor_inteiro = 1022;
    valor_inteiro *= 2;
    _tcscpy_s(par_nome, TAM, TEXT("atributo inteiro"));
    if (RegSetValueEx(
        chave,
        par_nome,
        0,
        REG_DWORD,
        (LPCBYTE) &valor_inteiro,
        sizeof(DWORD)
    ) != ERROR_SUCCESS)
    {
        _tprintf(TEXT("Atributo %s não foi encotnrado!! ERRO\n"), par_nome);
    }

    _tcscpy_s(par_nome, TAM, TEXT("atributo binario"));

    if (RegSetValueEx(
        chave,
        par_nome,
        0,
        REG_BINARY,
        (LPCBYTE) &valor_inteiro,
        sizeof(DWORD)
    ) != ERROR_SUCCESS)
    {
        _tprintf(TEXT("Atributo %s não foi encotnrado!! ERRO\n"), par_nome);
    }
    RegCloseKey(chave); //importante: fechar sempre o Handle da chave 
    return 0;
}

Tags : , , ,