Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/145: Рейтинг темы: голосов - 145, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
1

Журнал событий

19.11.2017, 09:37. Показов 27935. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет,
пытаюсь сделать просмотр журналов событий Windows 8 на си++ в QT.
Подготовил код, ошибка на этапе READEVENTLOG, помогите исправить
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <cstdlib>
#include <clocale>
 
tm * ConvDWORD2Time(DWORD dwTime);
void ShowRECORD(PVOID lpBuffer, DWORD *dwPos);
 
int main()
{
    HWND hWnd = GetForegroundWindow();
    DWORD dwCurentRecord  = 0;
    DWORD NumberOfRecords = 0;
    PVOID lpBuffer = NULL;
    DWORD dwRead   = 0;
    DWORD dwNeed   = 0;
    DWORD dwSize   = sizeof(EVENTLOGRECORD);
    DWORD dwPos    = 0;
    //system("chcp 1251");
    HANDLE hEventLog = OpenBackupEventLogA(NULL,"C:\\Kurs\\system.evtx");
    if(!hEventLog)
        MessageBoxA(hWnd,"OpenBackupEventLog",NULL,MB_OK|MB_ICONERROR);
    else
    if(!GetNumberOfEventLogRecords(hEventLog, &NumberOfRecords))
        MessageBoxA(hWnd,"GetNumberOfEventLogRecords",NULL,MB_OK|MB_ICONERROR);
    else
    {
        printf("HANDLE hEventLog      : 0x%p\n",hEventLog);
        printf("DWORD NumberOfRecords : %u\n"  ,NumberOfRecords);
        //Память под массив структур
        lpBuffer = malloc(NumberOfRecords*dwSize*8);
        if
        (
            !ReadEventLog
            (
                hEventLog,
                EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,
                0,
                lpBuffer,
                NumberOfRecords*dwSize,
                &dwRead,
                &dwNeed
            )
        )
            MessageBoxA(hWnd,"ReadEventLog",NULL,MB_OK|MB_ICONERROR); //на этом этапе программа останавливается.
        else
        for
        (dwPos = 0; 0 < dwRead; dwRead = dwRead - dwPos)
        {
            ShowRECORD(((char *)lpBuffer + dwPos),&dwPos);
            system("pause");
        }
        free(lpBuffer);
    }
    if(hEventLog)
        CloseHandle(hEventLog);
    system("pause");
    return 0;
}
 
tm * ConvDWORD2Time(DWORD dwTime)
{
   time_t t = (time_t)dwTime;
   tm * ptm = {0};
    localtime_s (ptm, &t);
   return ptm;
}
 
void ShowRECORD(PVOID lpBuffer, DWORD *dwPos)
{
 
    tm * ptm;
    EVENTLOGRECORD pRECORD = *(EVENTLOGRECORD *)lpBuffer;
    printf("Length       : %d\n",pRECORD.Length);
    printf("RecordNumber : %d\n",pRECORD.RecordNumber);
    printf("TimeGenerated: %s",asctime(ConvDWORD2Time(pRECORD.TimeGenerated)));
    printf("TimeWritten  : %s",asctime(ConvDWORD2Time(pRECORD.TimeWritten)));
    printf("EventID      : %d\n",pRECORD.EventID);
    printf("EventType    : ");
    switch(pRECORD.EventType)
    {
    case EVENTLOG_ERROR_TYPE:
        printf("Error event\n");
        break;
    case EVENTLOG_AUDIT_FAILURE:
        printf("Failure Audit event\n");
        break;
    case EVENTLOG_AUDIT_SUCCESS:
        printf("Success Audit event\n");
        break;
    case EVENTLOG_INFORMATION_TYPE:
        printf("Information event\n");
        break;
    case EVENTLOG_WARNING_TYPE:
        printf("Warning event\n");
        break;
    }
    printf("NumStrings   : %d\n",pRECORD.NumStrings);
    printf("StringOffset : %d\n",pRECORD.StringOffset);
    printf("UserSidLength: %d\n",pRECORD.UserSidLength);
    printf("UserSidOffset: %d\n",pRECORD.UserSidOffset);
    printf("DataLength   : %d\n",pRECORD.DataLength);
    printf("DataOffset   : %d\n",pRECORD.DataOffset);
    printf("DataEntry    : %s\n",(char *)lpBuffer + pRECORD.StringOffset);
    printf("\n");
 
    (*dwPos) = pRECORD.Length;
}
Миниатюры
Журнал событий  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2017, 09:37
Ответы с готовыми решениями:

Журнал событий Windows
Необходимо написать программу на Winapi, которая будет считывать данные из Журнала событий Windows.

Журнал событий?
надо создать что-то типа журнала событий. проблема в том чтобы вести хронологию. замучался с...

Журнал событий
Есть объект. И есть 30 сигналов. У каждого сигнала есть своё одно состояние (либо авария(красный...

Журнал событий
Здраствуйте!! Запара втом что нужно написать програму з выкорыстанням функцыи: ...

35
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
21.11.2017, 15:35 21
Author24 — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
std::tm dw_to_tm(DWORD dwTime) {
    std::time_t t = dwTime;
    std::tm _tm = { 0 };
    localtime_s(&_tm,&t);
 
    return _tm;
}
 
std::tm make_tm(int year, int month, int day)
{
    std::tm tm = { 0 };
    tm.tm_year = year - 1900; // years count from 1900
    tm.tm_mon = month - 1;    // months count from January=0
    tm.tm_mday = day;         // days count from 1
    return tm;
}
 
 
void print_one_record(BYTE *rec) {
 
    EVENTLOGRECORD *pRecord = (EVENTLOGRECORD*)rec;
 
    std::tm curr = dw_to_tm(pRecord->TimeGenerated);
    std::tm date = make_tm(2013, 12, 2);
 
    // вывод только за 02.12.2013
 
    if (!((curr.tm_year == date.tm_year) && (curr.tm_mon == date.tm_mon) && (curr.tm_mday == date.tm_mday)))
        return;
 
    //wchar_t *str = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)); //WTF???? is not wchar_t
 
    std::cout << "EventType: " << pEventTypeNames[GetEventTypeName(pRecord->EventType)] << std::endl;
 
    std::string source_name((char*)(rec + sizeof(EVENTLOGRECORD)));
    std::string computer_name((char*)(rec + sizeof(EVENTLOGRECORD) + source_name.length() + 1));
.......
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 16:02  [ТС] 22
ISergey, большое спасибо вам за помощь) Очень выручили)

Добавлено через 12 минут
Можно последний вопрос при запуске вашего кода, в полях provider и computer name, выводится только первая буква значения. Пример: источник:UserModePowerService, выводится только U. Как можно вывести полное название?
0
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 16:06  [ТС] 23
Вот
Миниатюры
Журнал событий  
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
21.11.2017, 16:19 24
Похоже это то о чем я писал выше post11731377
Это
C
1
2
3
4
5
6
std::string source_name((char*)(rec + sizeof(EVENTLOGRECORD)));
    std::string computer_name((char*)(rec + sizeof(EVENTLOGRECORD) + source_name.length() + 1));
 
 
    std::cout << "Provider: " << source_name << std::endl;
    std::cout << "ComputerName: " << computer_name << std::endl;
Попробуй поменять на
C
1
2
3
4
5
6
    std::wstring source_name((wchar_t*)(rec + sizeof(EVENTLOGRECORD)));
    std::wstring computer_name((wchar_t*)(rec + sizeof(EVENTLOGRECORD) + source_name.length() + 1));
 
 
    std::wcout << L"Provider: " << source_name << std::endl;
    std::wcout << L"ComputerName: " << computer_name << std::endl;
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 16:24  [ТС] 25
Теперь вообще не отображаются эти параметры.
Миниатюры
Журнал событий  
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
21.11.2017, 16:28 26
уберите комментарий с этого
C
1
 //wchar_t *str = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)); //WTF???? is not wchar_t
ниже поставьте брейкпоинт. и нужно смотреть что лежит по адресу str в памяти.
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 16:35  [ТС] 27
Как поставить брейкпоинт?
0
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 16:40  [ТС] 28
Вот.
C++ (Qt)
1
2
wchar_t *str = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)); //WTF???? is not wchar_t
    std::cout<<*str;
Эту часть закомментил.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* std::cout << "EventType: " << pEventTypeNames[GetEventTypeName(pRecord->EventType)] << std::endl;
 
    std::wstring source_name((wchar_t*)(rec + sizeof(EVENTLOGRECORD)));
       std::wstring computer_name((wchar_t*)(rec + sizeof(EVENTLOGRECORD) + source_name.length() + 1));
 
       std::wcout << L"Provider: " << source_name << std::endl;
       std::wcout << L"ComputerName: " << computer_name << std::endl;
    std::cout << "Length: " << pRecord->Length << std::endl;
    std::cout << "RecordNumber: " << pRecord->RecordNumber << std::endl;
    std::cout << "TimeGenerated: " << conv_time(pRecord->TimeGenerated) << std::endl;
    int count = 0;
    std::cout << "--Strings-- [ " << pRecord->Length << " ]" << std::endl;
    for (char *str = (char*)(rec + pRecord->StringOffset); count < pRecord->NumStrings; ++count) {
        std::cout << "  -> " << str << std::endl;
        str += strlen(str) + 1;
    }
*/
Миниатюры
Журнал событий  
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
21.11.2017, 16:49 29
Цитата Сообщение от Tel23 Посмотреть сообщение
Как поставить брейкпоинт?
Как пользоваться отладчиком (в Visual Studio)
Это
C
1
std::cout<<*str;
нужно так
C
1
std::wcout<<str;
разница вот где
cout и wcout немного разные.
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 16:51  [ТС] 30
Исправил
C++ (Qt)
1
std::wcout<<str;
P.S. Я на QT пишу.
Миниатюры
Журнал событий  
0
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 16:57  [ТС] 31
Вот вроде подправил, но теперь и в provide и в computername одно и тоже выводится
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <windows.h>
#include <ctime>
#include <iostream>
#include <string>
 
//EVENTLOGRECORD{
//....
//DWORD  DataOffset;    // Offset from beginning of record
// Then follow:
//
// WCHAR SourceName[]
// WCHAR Computername[]
// SID   UserSid
// WCHAR Strings[]
// BYTE  Data[]
// CHAR  Pad[]
// DWORD Length;
 
char* pEventTypeNames[] = { "Error", "Warning", "Informational", "Audit Success", "Audit Failure" };
 
DWORD GetEventTypeName(DWORD EventType); //Получение имени типа события
 
std::string conv_time(DWORD dwTime) { //
    std::time_t result = dwTime;
    return std::asctime(std::localtime(&result));
}
 
void print_one_record(BYTE *rec) { //Выводим одну запись
 
    EVENTLOGRECORD *pRecord = (EVENTLOGRECORD*)rec;
 
    wchar_t *str = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)); //WTF???? is not wchar_t
    //std::wcout<<str;
 
    std::cout << "EventType: " << pEventTypeNames[GetEventTypeName(pRecord->EventType)] << std::endl;
 
    std::wstring source_name((wchar_t*)(rec + sizeof(EVENTLOGRECORD)));
       std::wstring computer_name((wchar_t*)(rec + sizeof(EVENTLOGRECORD) + source_name.length() + 1));
 
       std::wcout << L"Provider: " << str << std::endl;
       std::wcout << L"ComputerName: " << str << std::endl;
    std::cout << "Length: " << pRecord->Length << std::endl;
    std::cout << "RecordNumber: " << pRecord->RecordNumber << std::endl;
    std::cout << "TimeGenerated: " << conv_time(pRecord->TimeGenerated) << std::endl;
    int count = 0;
    std::cout << "--Strings-- [ " << pRecord->Length << " ]" << std::endl;
    for (char *str = (char*)(rec + pRecord->StringOffset); count < pRecord->NumStrings; ++count) {
        std::cout << "  -> " << str << std::endl;
        str += strlen(str) + 1;
    }
 
}
 
void print_records(BYTE *rec, DWORD rec_size) { //повторяем вывод записей до тех пор, пока в журнале не кончатся записи
    PBYTE pRecord = rec;
    PBYTE pEndOfRecords = rec + rec_size;
 
    while (pRecord < pEndOfRecords)
    {
        print_one_record(pRecord);
 
        pRecord += ((PEVENTLOGRECORD)pRecord)->Length;
    }
 
}
 
int main()
{
    const unsigned MAX_BUFF_SIZE = 0x10000;
 
    DWORD NumberOfRecords = 0;
    BYTE *pBuffer = new BYTE[MAX_BUFF_SIZE];
    DWORD dwBytesToRead = MAX_BUFF_SIZE;
    DWORD status = ERROR_SUCCESS;
 
    DWORD dwBytesRead = 0;
    DWORD dwMinimumBytesToRead = 0;
 
    HANDLE hEventLog = OpenBackupEventLogA(NULL, "C:\\Kurs\\system.evtx"); //Вводим имя нужного нам журнала
 
    setlocale(LC_ALL, "Russian");//устанавливаем русский язык
    if (!hEventLog)
    {
        std::cout << "OpenBackupEventLogA [ " << std::hex << GetLastError() << " ]" << std::endl; //вывод последней ошибки
        return 0;
    }
 
    if (!GetNumberOfEventLogRecords(hEventLog, &NumberOfRecords))
    {
        std::cout << "GetNumberOfEventLogRecords [ " << std::hex << GetLastError() << " ]" << std::endl;
        return 0;
    }
 
    std::cout << "NumberOfRecords [ " << NumberOfRecords << " ]" << std::endl;
 
    while (ERROR_SUCCESS == status)
    {
        if (!ReadEventLog(hEventLog,
            EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ,
            0,
            pBuffer,
            dwBytesToRead,
            &dwBytesRead,
            &dwMinimumBytesToRead))
        {
            status = GetLastError();
            if (ERROR_INSUFFICIENT_BUFFER == status)
            {
                status = ERROR_SUCCESS;
 
                BYTE *pTemp = new BYTE[dwMinimumBytesToRead];
                delete[] pBuffer;
 
                pBuffer = pTemp;
                dwBytesToRead = dwMinimumBytesToRead;
            }
            else
            {
                if (ERROR_HANDLE_EOF != status)
                {
                    if (hEventLog)
                        CloseEventLog(hEventLog);
                    delete[] pBuffer;
                    return 0;
                }
            }
        }
        else
        {
 
            print_records(pBuffer, dwBytesRead);
        }
    }
 
    if (hEventLog)
        CloseEventLog(hEventLog);
 
    delete[] pBuffer;
    return 0;
}
 
 
DWORD GetEventTypeName(DWORD EventType) //Получение имени типа события
{
    DWORD index = 0;
 
    switch (EventType)
    {
    case EVENTLOG_ERROR_TYPE:
        index = 0;
        break;
    case EVENTLOG_WARNING_TYPE:
        index = 1;
        break;
    case EVENTLOG_INFORMATION_TYPE:
        index = 2;
        break;
    case EVENTLOG_AUDIT_SUCCESS:
        index = 3;
        break;
    case EVENTLOG_AUDIT_FAILURE:
        index = 4;
        break;
    }
 
    return index;
}
Миниатюры
Журнал событий  
0
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 17:01  [ТС] 32
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <windows.h>
#include <ctime>
#include <iostream>
#include <string>
 
//EVENTLOGRECORD{
//....
//DWORD  DataOffset;    // Offset from beginning of record
// Then follow:
//
// WCHAR SourceName[]
// WCHAR Computername[]
// SID   UserSid
// WCHAR Strings[]
// BYTE  Data[]
// CHAR  Pad[]
// DWORD Length;
 
char* pEventTypeNames[] = { "Error", "Warning", "Informational", "Audit Success", "Audit Failure" };
 
DWORD GetEventTypeName(DWORD EventType); //Получение имени типа события
 
std::string conv_time(DWORD dwTime) { //
    std::time_t result = dwTime;
    return std::asctime(std::localtime(&result));
}
 
void print_one_record(BYTE *rec) { //Выводим одну запись
 
    EVENTLOGRECORD *pRecord = (EVENTLOGRECORD*)rec;
 
 
    //std::wcout<<str;
 
    std::cout << "EventType: " << pEventTypeNames[GetEventTypeName(pRecord->EventType)] << std::endl;
    wchar_t *str = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)); //WTF???? is not wchar_t
    wchar_t *ptr = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)+str.length()+1); 
    
//    std::wstring source_name((wchar_t*)(rec + sizeof(EVENTLOGRECORD)));
 //      std::wstring computer_name((wchar_t*)(rec + sizeof(EVENTLOGRECORD) + source_name.length() + 1));
 
       std::wcout << L"Provider: " << str << std::endl;
       std::wcout << L"ComputerName: " << ptr << std::endl;
    std::cout << "Length: " << pRecord->Length << std::endl;
    std::cout << "RecordNumber: " << pRecord->RecordNumber << std::endl;
    std::cout << "TimeGenerated: " << conv_time(pRecord->TimeGenerated) << std::endl;
    int count = 0;
    std::cout << "--Strings-- [ " << pRecord->Length << " ]" << std::endl;
    for (char *str = (char*)(rec + pRecord->StringOffset); count < pRecord->NumStrings; ++count) {
        std::cout << "  -> " << str << std::endl;
        str += strlen(str) + 1;
    }
 
}
 
void print_records(BYTE *rec, DWORD rec_size) { //повторяем вывод записей до тех пор, пока в журнале не кончатся записи
    PBYTE pRecord = rec;
    PBYTE pEndOfRecords = rec + rec_size;
 
    while (pRecord < pEndOfRecords)
    {
        print_one_record(pRecord);
 
        pRecord += ((PEVENTLOGRECORD)pRecord)->Length;
    }
 
}
 
int main()
{
    const unsigned MAX_BUFF_SIZE = 0x10000;
 
    DWORD NumberOfRecords = 0;
    BYTE *pBuffer = new BYTE[MAX_BUFF_SIZE];
    DWORD dwBytesToRead = MAX_BUFF_SIZE;
    DWORD status = ERROR_SUCCESS;
 
    DWORD dwBytesRead = 0;
    DWORD dwMinimumBytesToRead = 0;
 
    HANDLE hEventLog = OpenBackupEventLogA(NULL, "C:\\Kurs\\system.evtx"); //Вводим имя нужного нам журнала
 
    setlocale(LC_ALL, "Russian");//устанавливаем русский язык
    if (!hEventLog)
    {
        std::cout << "OpenBackupEventLogA [ " << std::hex << GetLastError() << " ]" << std::endl; //вывод последней ошибки
        return 0;
    }
 
    if (!GetNumberOfEventLogRecords(hEventLog, &NumberOfRecords))
    {
        std::cout << "GetNumberOfEventLogRecords [ " << std::hex << GetLastError() << " ]" << std::endl;
        return 0;
    }
 
    std::cout << "NumberOfRecords [ " << NumberOfRecords << " ]" << std::endl;
 
    while (ERROR_SUCCESS == status)
    {
        if (!ReadEventLog(hEventLog,
            EVENTLOG_SEQUENTIAL_READ | EVENTLOG_BACKWARDS_READ,
            0,
            pBuffer,
            dwBytesToRead,
            &dwBytesRead,
            &dwMinimumBytesToRead))
        {
            status = GetLastError();
            if (ERROR_INSUFFICIENT_BUFFER == status)
            {
                status = ERROR_SUCCESS;
 
                BYTE *pTemp = new BYTE[dwMinimumBytesToRead];
                delete[] pBuffer;
 
                pBuffer = pTemp;
                dwBytesToRead = dwMinimumBytesToRead;
            }
            else
            {
                if (ERROR_HANDLE_EOF != status)
                {
                    if (hEventLog)
                        CloseEventLog(hEventLog);
                    delete[] pBuffer;
                    return 0;
                }
            }
        }
        else
        {
 
            print_records(pBuffer, dwBytesRead);
        }
    }
 
    if (hEventLog)
        CloseEventLog(hEventLog);
 
    delete[] pBuffer;
    return 0;
}
 
 
DWORD GetEventTypeName(DWORD EventType) //Получение имени типа события
{
    DWORD index = 0;
 
    switch (EventType)
    {
    case EVENTLOG_ERROR_TYPE:
        index = 0;
        break;
    case EVENTLOG_WARNING_TYPE:
        index = 1;
        break;
    case EVENTLOG_INFORMATION_TYPE:
        index = 2;
        break;
    case EVENTLOG_AUDIT_SUCCESS:
        index = 3;
        break;
    case EVENTLOG_AUDIT_FAILURE:
        index = 4;
        break;
    }
 
    return index;
}
Вот попробовал исправить, появилось это.
Миниатюры
Журнал событий  
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
21.11.2017, 17:07 33
C
1
 wchar_t *ptr = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)+str.length()+1);
->
C
1
wchar_t *ptr = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)+wcslen(str) + 1);
может быть даже так
C
1
wchar_t *ptr = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)+wcslen(str)*2 + 2);
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
21.11.2017, 17:19  [ТС] 34
Таким способом все выводится, только я не понял, зачем мы умножили на 2 и прибавили 2...
Цитата Сообщение от ISergey Посмотреть сообщение
может быть даже так
CВыделить код
1
wchar_t *ptr = (wchar_t*)(rec + sizeof(EVENTLOGRECORD)+wcslen(str)*2 + 2);
Добавлено через 6 минут
Вообщем, еще раз большое спасибо за помощь
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
21.11.2017, 17:30 35
rec это указатель на PBYTE
rec + sizeof(EVENTLOGRECORD) мы сместились на замер структуры (пусть на 100 байт)
wcslen(str) вернет кол-во символов в строке !, один wchar_t занимает 2 байта
поэтому нужно умножить на 2. и +2 это чтобы пропустить два нулевых байта
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 29
22.11.2017, 07:18  [ТС] 36
Аа, теперь вроде понял. Спасибо за пояснения.
0
22.11.2017, 07:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2017, 07:18
Помогаю со студенческими работами здесь

Проблема с функцией журнал событий
Переношу проект из Rad XE 2010 в Rad XE2. Ну и конечно не без проблем, в решении которых я все...

Журнал Событий Win32API: OpenBackupEventLog function
Здраствуйте!! Запара втом что нужно написать програму з выкорыстанням функцыи: OpenBackupEventLog...

Журнал событий с записью в файл с перегуженными операциями
Доброго времени суток! Кто может помочь с написанием программы? Нужно или полностью, либо какие...

Электронный Журнал на С++
помогите сделать программу «электронный журнал». Программа должна хранить о студенте данные:...

Долговой журнал магазина
Доброго здравия, дорогие форумчане. Программировать я еще только учусь. Хочу написать долговой...

Структуры. Журнал посещения
Необходимо создать список студентов и отмечать их посещение + и -. у меня получилось только:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru