How to read registry correctly for multiple values in c?

Posted by kampi on Stack Overflow See other posts from Stack Overflow or by kampi
Published on 2010-03-21T03:59:21Z Indexed on 2010/03/21 4:01 UTC
Read the original article Hit count: 504

Filed under:
|
|

Hi!

I created a .dll which should work like the RunAs command. The only difference is, that it should read from registry. My problem is, that i need to reed 3 values from the registry, but i can't. It reads the first, than it fails at the second one (Password) with error code 2, which means "The system cannot find the file specified". If i query only for domain and username then it is ok, if i query only for password then it it still succeeds, but if i want to query all three then it fails. Can someone tell me, what i am doing wrong?

Heres my code:

HKEY hKey = 0;
DWORD dwType = REG_SZ;    
DWORD dwBufSize = sizeof(buf);
TCHAR szMsg [MAX_PATH + 32]; 
HANDLE handle;
LPVOID lpMsgBuf;

if( RegOpenKeyEx( HKEY_CURRENT_USER, TEXT("SOFTWARE\\Kampi Corporation\\RunAs!"), 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS )    
{
        if( RegQueryValueEx( hKey, TEXT("Username"), 0, &dwType, (LPBYTE)buf, &dwBufSize ) == ERROR_SUCCESS )        
            {
                memset( szMsg, 0, sizeof( szMsg ) );
                wsprintf ( szMsg, _T("%s"), buf );
                mbstowcs( wuser, szMsg, 255 );
                RegCloseKey( hKey );
            }        
            else
            {
                MessageBox ( pCmdInfo->hwnd, "Can not query for Username key value!", _T("RunAs!"), MB_ICONERROR );
                RegCloseKey( hKey );
                return -1;
            }
}
else
{
     CSimpleShlExt::showerror( GetLastError(), pCmdInfo->hwnd, "RegOpenKeyEx failed for Username with error code :: " );
     return -1;
}

if( RegOpenKeyEx( HKEY_CURRENT_USER, TEXT("SOFTWARE\\Kampi Corporation\\RunAs!"), 0, KEY_QUERY_VALUE ,&hKey ) == ERROR_SUCCESS )    
{
   if( RegQueryValueEx( hKey, TEXT("Password"), 0, &dwType, (LPBYTE)buf, &dwBufSize ) == ERROR_SUCCESS )        
   {
     memset( szMsg, 0, sizeof( szMsg ) );
     wsprintf ( szMsg, _T("%s"), buf );
     mbstowcs( wpass, szMsg, 255 );
     RegCloseKey( hKey );
   }        
   else
   {
          char test[200];
     sprintf(test,"Can not query for Password key value! EC: %d",GetLastError() );
     MessageBox ( pCmdInfo->hwnd, test, _T("RunAs!"), MB_ICONERROR );
     RegCloseKey( hKey );
     return -1;
   }
}
else
{
CSimpleShlExt::showerror( GetLastError(), pCmdInfo->hwnd, "RegOpenKeyEx failed for Password with error code :: " );
return -1;
}

if( RegOpenKeyEx( HKEY_CURRENT_USER, TEXT("SOFTWARE\\Kampi Corporation\\RunAs!"), 0, KEY_QUERY_VALUE ,&hKey ) == ERROR_SUCCESS )    
{
     if( RegQueryValueEx( hKey, TEXT("Domain"), 0, &dwType, (LPBYTE)buf, &dwBufSize ) == ERROR_SUCCESS )        
     {
          memset( szMsg, 0, sizeof( szMsg ) );
     wsprintf ( szMsg, _T("%s"), buf );
     mbstowcs( wdomain, szMsg, 255 );
     RegCloseKey( hKey );
}        
else
{
     char test[200];
     sprintf(test,"Can not query for Password key value! EC: %d",GetLastError() );
     MessageBox ( pCmdInfo->hwnd, test, _T("RunAs!"), MB_ICONERROR );
     RegCloseKey( hKey );
     return -1;
}
}
else
{
 CSimpleShlExt::showerror( GetLastError(), pCmdInfo->hwnd, "RegOpenKeyEx failed for Domain with error code :: " );
 return -1;
}

© Stack Overflow or respective owner

Related posts about Windows

Related posts about registry