Monday, March 28, 2011

Anniversary of the blog

Happy birthday, my little blog. ;)

Monday, March 7, 2011

Чтение EventLog

Для определения событий входа в систему и выхода из неё потребовалась считывать соответствующие события из системного EventLog’а. Данные события находятся в журнале Безопасность.
Чтобы программно получить доступ, к данному журналу необходимо указать следующее имя:
Для систем до Windows Vista “Security
Начиная с Vista “Microsoft-Windows-security-auditing

Номера событий (EventID) до висты были следующие:
для входа 528, а для выхода из системы 538.
Начиная с висты стали:
4624 для входа и 4634 для выхода.

Для разделения строк в записи использую QString-овский сплит.
Исходный код для чтения события произошедшего последним представлен ниже:

void ReadLastEntryByInstanceId(QString sourceName, int instanceId)
{
 HANDLE eventLogHandle;  
 BYTE entryBuffer[16384]; 
 DWORD dwRead, dwNeeded; 
 DWORD eventsNumber;
 EVENTLOGRECORD *entry;  
 bool isFound = false;
 
 eventLogHandle = OpenEventLog(NULL, sourceName.toAscii().data()); 
 if (eventLogHandle == NULL) return false;
 
 entry = (EVENTLOGRECORD*)&entryBuffer;   
 GetNumberOfEventLogRecords(eventLogHandle, &eventsNumber);
 
 while (ReadEventLog(eventLogHandle, EVENTLOG_BACKWARDS_READ | EVENTLOG_SEQUENTIAL_READ, 
 eventsNumber, entry, 16384, &dwRead, &dwNeeded) && (isFound == false))
 {
  while (dwRead > 0) 
  { 
   if (entry->EventID == instanceId && isFound == false)
   {
    isFound = true;     
 
    QString strings;
    QByteArray stringsBytes;
    stringsBytes.append((char*)entry + entry->StringOffset, entry->DataOffset - entry->StringOffset);
    strings = QString::fromWCharArray((wchar_t*)stringsBytes.data(), stringsBytes.size() / 2 - 1); 
 
    // Split strings
    QStringList stringsList = strings.split(QString(1, '\0'));
 
    // Use stringsList      
   }
 
   dwRead -= entry->Length; 
   entry = (EVENTLOGRECORD*)((LPBYTE)entry + entry->Length);     
  }
 
  entry = (EVENTLOGRECORD*)&entryBuffer;  
 }
 
 CloseEventLog(eventLogHandle); 
}

Thursday, March 3, 2011

QtService


Создавая службу на основе QtService версии 2.6.1, при компоновке происходили ошибки следующего вида:

error LNK2019: unresolved external symbol "public: __thiscall QtServiceBase::QtServiceBase(int,char * *,class QString const &)" (??0QtServiceBase@@QAE@HPAPADABVQString@@@Z) referenced in function "public: __thiscall QtService::QtService(int,char * *,class QString const &)" (??0?$QtService@VQCoreApplication@@@@QAE@HPAPADABVQString@@@Z)

error LNK2019: unresolved external symbol "public: virtual __thiscall QtServiceBase::~QtServiceBase(void)" (??1QtServiceBase@@UAE@XZ) referenced in function "public: virtual __thiscall QtService::~QtService(void)" (??1?$QtService@VQCoreApplication@@@@UAE@XZ)

Для того чтобы правильно собрать модуль
нужно сделать следующее:
Взять файл examples.pro, в папке examples предварительно создав папку с названием проекта, изменить его следующим образом:

Присвоить ему имя необходимого solution:
solution_name.pro

А содержимое этого файла должно иметь следующий вид:

TEMPLATE = subdirs
SUBDIRS = project_name\

Где SUBDIRS обозначает имя проекта, который будет создан в solution.

В папке project_name\ должны быть файлы:

project_name.pro
project_name.qdoc
и как минимум файл main.cpp

В файле project_name.pro

TARGET = ProjectName
TEMPLATE = app
CONFIG += console qt
QT = core network 

QT указывает какие Qt библиотеки будут использоваться в проекте:


SOURCES = main.cpp
include(../../src/qtservice.pri)

Затем необходимо открыть файл solution_name.pro в студии:




Открыв файл должно появиться следующее окно:



По окончании данного процесса будет сгенерирован солюшн с проектом.