Problem reading NT Security Event Log. 
Author Message
 Problem reading NT Security Event Log.

Im trying to write my own "EventViewer".
Sometimes when  I try to get  the description of the  information in
the NT Security EventLog. There are codes  (%%1542) inserted  in the
EVENTLOGRECORD Strings[] like this:
Object Open:
        Object Server: Security Account Manager
        Object Type: SAM_DOMAIN
        Object Name: CQ-2
        New Handle ID: 1274648
        Operation ID: {0,30197799}
        Process ID: 2154034944
        Primary User Name: SYSTEM
        Primary Domain: NT AUTHORITY
        Primary Logon ID: (0x0,0x6A3)
        Client User Name: anhio
        Client Domain: CQ-2
        Client Logon ID: (0x0,0x76E3)
        Accesses %%5392
                %%5393
                %%5396
                %%5398
                %%5399
                %%5400
                %%5401
        Privileges -

How can I get this coded information decoded?

Made this C code but did not succeed:
My problem is in the function GetParameterMsg().

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>

#define BUFFER_SIZE 512

#define ErrorExit printf{}

#define True    1
#define False   0

boolean SetLastRecordNr(char *Log, DWORD *RecordNr)
{

        char    tmp[100];
        HKEY    hkey;
        DWORD   bufLen = sizeof(DWORD);

        sprintf(tmp,"SOFTWARE\\MY\\LOGS\\%s", Log);

        if (ERROR_SUCCESS == RegCreateKey(HKEY_LOCAL_MACHINE, tmp,
&hkey))
        {
                if (ERROR_SUCCESS == RegSetValueEx(hkey,TEXT
("RecordNr"), 0, REG_DWORD, (BYTE *)RecordNr, bufLen))
                {
                        RegCloseKey(hkey);
                        return True;
                }

                RegCloseKey(hkey);
                return False;
        }
        return  False;

Quote:
}

unsigned int GetLastRecordNr(char *Log)
{

        char    tmp[100];
        HKEY    hkey;
        DWORD   bufLen = sizeof(DWORD), RecordNr;

        sprintf(tmp,"SOFTWARE\\MY\\LOGS\\%s", Log);

        if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, tmp, &hkey))
        {
                if (ERROR_SUCCESS == RegQueryValueEx(hkey,TEXT
("RecordNr"), NULL, NULL, (BYTE *)&RecordNr, &bufLen))
                {
                        RegCloseKey(hkey);
                        return RecordNr;
                }

                RegCloseKey(hkey);
                return 0;
        }
        return  0;

Quote:
}

void ReportErrorMsg()
{
        LPVOID  lpMsgBuf;

        FormatMessage(
                FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                GetLastError(),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default
language
                (LPTSTR) &lpMsgBuf,
                0,
                NULL
        );
        // Process any inserts in lpMsgBuf.
        // ...
        // Display the string.
        MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK |
MB_ICONINFORMATION );
        // Free the buffer.
        LocalFree( lpMsgBuf );

Quote:
}

char * GetParameterMsg(char *message, char *tmp)
{
        int             I, StringId, FileNameModuleSize = 100;
        char    *EndPtr;
        HKEY    nKeyHandle=0;
        BYTE    FileNameModule[100],expbuffer[BUFFER_SIZE];
        //LPVOID        lpBuffer;
        char    lpBuffer[BUFFER_SIZE], tmpStr[1000], *DescrStr,
*StartPtr;

        if(RegOpenKey(HKEY_LOCAL_MACHINE,
                                (LPTSTR) tmp,
                                &nKeyHandle) != ERROR_SUCCESS)
                                ReportErrorMsg();

        if (RegQueryValueEx(nKeyHandle,
                                "ParameterMessageFile",
                                NULL,
                                NULL,
                                FileNameModule,
                                &FileNameModuleSize) != ERROR_SUCCESS)
                                ReportErrorMsg();

        ExpandEnvironmentStrings(
                                FileNameModule,         // pointer to
string with environment variables
                                expbuffer,
        /*pointer to string with expanded environment variables */
                                BUFFER_SIZE);           /*maximum
characters in expanded string*/

        RegCloseKey(HKEY_LOCAL_MACHINE);
        EndPtr = message;
        StartPtr = message;
        *tmpStr = '\0';
        StringId = strtol(strtok(StartPtr +2, "\n\t"),&EndPtr,10);
        while (StringId != 0)
        {

                I= FormatMessage(
                                FORMAT_MESSAGE_FROM_HMODULE|
                                FORMAT_MESSAGE_FROM_SYSTEM|
                                FORMAT_MESSAGE_IGNORE_INSERTS|
                                FORMAT_MESSAGE_ALLOCATE_BUFFER,
                                LoadLibraryEx(expbuffer,
NULL,LOAD_LIBRARY_AS_DATAFILE),
                                StringId,
                                0, //MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT), // Default language
                                (LPTSTR) &lpBuffer,
                                255,
                                (LPTSTR *) NULL
                        );

                if (I== 0)
                {
                        LocalFree( lpBuffer );
                        return NULL;

                }
                strcat(tmpStr, (char *)lpBuffer);
                strcat(tmpStr, "\n\t\t");
                StartPtr = strstr(StartPtr, "%%");
                StringId = strtol(strtok(StartPtr, "\n\t"),&EndPtr,10);
                LocalFree( lpBuffer );
        }

        DescrStr = malloc(strlen(tmpStr) + strlen((char *) lpBuffer)+1);
        strcpy(DescrStr, tmpStr);

        return DescrStr;

Quote:
}

boolean GetDescription(char *Log, EVENTLOGRECORD *EventLogRecPtr, char
*tmpStr)
{
        int     i=0,I ,j , FileNameModuleSize = 100;
        char    tmp[200];
        HKEY    nKeyHandle=0;
        BYTE    FileNameModule[100],expbuffer[BUFFER_SIZE];
        LPTSTR  message, *strings, AllocedStr[20] ;
        LPVOID  lpBuffer;//char *lpBuffer,

        sprintf(tmp,
                        "SYSTEM\\CurrentControlSet\\Services\\EventLog\\
%s\\%s",
                        Log, (LPBYTE)EventLogRecPtr +  sizeof
(EVENTLOGRECORD));

        RegOpenKey(HKEY_LOCAL_MACHINE,
                                (LPTSTR) tmp,
                                &nKeyHandle);

        RegQueryValueEx(nKeyHandle,

        "EventMessageFile",
                                                        NULL,
                                                        NULL,
                                                        FileNameModule,

        &FileNameModuleSize);

        ExpandEnvironmentStrings(
                                FileNameModule,         // pointer to
string with environment variables
                                expbuffer,
        /*pointer to string with expanded environment variables */
                                BUFFER_SIZE);           /*maximum
characters in expanded string*/

        RegCloseKey(HKEY_LOCAL_MACHINE);

        if (nKeyHandle)
        {

                message = (LPTSTR)((LPBYTE)EventLogRecPtr +
EventLogRecPtr->StringOffset);

                strings = malloc(sizeof(LPVOID)*EventLogRecPtr-

Quote:
>NumStrings);

                for (j = 0; j <  EventLogRecPtr->NumStrings;j++)
                {
                        if (strstr(message,"%%"))
                        {
                                (LPTSTR) strings[j] = GetParameterMsg
(message, tmp);
                                AllocedStr[i++] = strings[j];
                        }
                        else
                                (LPTSTR) strings[j] = message;
                        message = message +     strlen(message) +1;

                }
                if( I=FormatMessage(

        FORMAT_MESSAGE_FROM_HMODULE|

        FORMAT_MESSAGE_ALLOCATE_BUFFER|

        FORMAT_MESSAGE_ARGUMENT_ARRAY,
                                                        LoadLibraryEx
(expbuffer, NULL, LOAD_LIBRARY_AS_DATAFILE),
                                                        EventLogRecPtr-

Quote:
>EventID,

                                                        0, //MAKELANGID
(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
                                                        (LPTSTR)
&lpBuffer,
                                                        0,
                                                        (LPTSTR *)
(strings)
                                                ) == 0)

                {
                        while (i >0)
                        {
                                free(AllocedStr[--i]);
                        }

                        LocalFree( lpBuffer );
                        return False;

                }

                strcpy(tmpStr, (char *) lpBuffer);
                for(I = 0; I< (int) strlen(tmpStr);I++)
                {
                        if((tmpStr[I] != 0) &&
                                ((tmpStr[I] < 32)||
                                (tmpStr[I] >126)))
                                tmpStr[I] = 32;
                }

                LocalFree( lpBuffer );
                printf("Description: %s", tmpStr);
                return True;

        }

        return False;

Quote:
}

boolean GetEventUserName(EVENTLOGRECORD *pelr, LPSTR pszUser, LPDWORD
pcbUser)
{
    PSID lpSid;
    char szName[256];
    char szDomain[256];
    SID_NAME_USE snu;
    DWORD dwLen;
    DWORD cbName = 256;
    DWORD cbDomain = 256;

    // Point to the SID.
         lpSid = (PSID)((LPBYTE) pelr + pelr->UserSidOffset);

    if (LookupAccountSid(NULL, lpSid, szName, &cbName, szDomain,
                         &cbDomain, &snu))
      {
        // Determine whether the buffer is large enough.
             dwLen = lstrlen(pszUser) + 1;

        if (dwLen > *pcbUser)
          {
            SetLastError( ERROR_INSUFFICIENT_BUFFER );
            *pcbUser = dwLen;
            return FALSE;
          }

        // Return the users name.

             lstrcpy( pszUser, szName );

      }
    else
      {
        // Use the error status from LookupAccountSid.
             return FALSE;
      }

    SetLastError(0);
    return TRUE;

Quote:
}

void main( )
{

    HANDLE h;

    EVENTLOGRECORD *pevlr;
    BYTE bBuffer[BUFFER_SIZE];
    DWORD dwRead, dwNeeded, dwThisRecord = 0, LastRecordNr;
        LPTSTR string=0;
        char    *System = "Security";//"Application";
        char    tstring[1000]="";

        DWORD pcbUser = 1000;

    // Open the Application event log.

    h = OpenEventLog( NULL,             // use local computer
             System);   // source name

    if (h == NULL)
        printf("Could not open the Application event log.");

    LastRecordNr = GetLastRecordNr(System);

        printf("LastRecordNumber: %d \n",LastRecordNr);

    pevlr = (EVENTLOGRECORD *) &bBuffer;

    // Opening the event log positions the file pointer for this
    // handle at the beginning of the log. Read the records
    // sequentially until there are no more.

    while (ReadEventLog(h,                // event log handle
                EVENTLOG_FORWARDS_READ |  // reads forward
                EVENTLOG_SEQUENTIAL_READ, // sequential read
                0,           // ignored for sequential reads
                pevlr,        // pointer to buffer
                BUFFER_SIZE,  // size of buffer
                &dwRead,      // number of bytes read
                &dwNeeded))   // bytes in next record
    {
        while (dwRead > 0)
        {
            // Print the event identifier, type, and source name.
            // The source name is just past the end of the
            // formal structure.

                        printf("RecordNr: %d\n",pevlr->RecordNumber);

                        if (pevlr->RecordNumber > LastRecordNr)
                        {
                                printf("%02d  Event ID: 0x%08X ",
                                    dwThisRecord++, pevlr-

Quote:
>EventID&0xFFFF);

                                printf("EventType: %d \tSource: %s
\tComputer: %s ",
                                        pevlr->EventType,
                                        (LPSTR) ((LPBYTE) pevlr + sizeof
(EVENTLOGRECORD)),
                                        (LPSTR) ((LPBYTE) pevlr + sizeof
(EVENTLOGRECORD)+ strlen((LPSTR) ((LPBYTE) pevlr + sizeof
(EVENTLOGRECORD)))) +1);

                                printf("\tData: %s\t", (LPSTR) ((LPBYTE)
pevlr + pevlr->StringOffset));

                                if (SetLastRecordNr(System, &(pevlr-

Quote:
>RecordNumber)))

                                         printf("\n Last
recordNumerSet: %d\n", pevlr->RecordNumber);

                                 if (!GetDescription(System, pevlr,
tstring))
                                {
                                        printf("\tShit happens all the
time");
                                }
                                else
                                        printf("\tDesription: %s\n",
tstring);

                        }
                        dwRead -= pevlr->Length;
                        pevlr = (EVENTLOGRECORD *)
                            ((LPBYTE) pevlr + pevlr->Length);

                }

        pevlr = (EVENTLOGRECORD *) &bBuffer;
    }

    CloseEventLog(h);

Quote:
}

My problem is in the function GetParameterMsg()
where FormatMessage allocates lpBuffer it dont contain anything that
make any sense, just bullshit like : 32 ' ' , 65 'A', 19 , 0 ''

Anyone please help me!

.....Im getting quite desperate....

/Ulf

Sent via Deja.com http://www.*-*-*.com/
Before you buy.



Tue, 30 Jul 2002 03:00:00 GMT  
 
 [ 1 post ] 

 Relevant Pages 

1. Reading NT Event Log

2. Writing Events to the NT Event Log

3. Problem writing an event to the Event Log

4. Windows NT Event Log

5. NT Event Log

6. Sending event messages to the NT log

7. NT / Win2000 Event logging from VC program Help !

8. NT event logging API - Expert required

9. NT Event Log

10. Writing to NT Event Log

11. NT Event Log

12. Windows NT Event Logging

 

 
Powered by phpBB® Forum Software