some fixes for EventLogRecord.stringData
This commit is contained in:
parent
e65b3f3068
commit
c28ab5253a
@ -3,7 +3,7 @@
|
||||
#include "win32bindings.h"
|
||||
|
||||
#define MAX_INSERT_STRS 8
|
||||
#define MAX_MSG_LENGTH 4096
|
||||
#define MAX_MSG_LENGTH 8192
|
||||
#define MAX_ERROR_LENGTH 1024
|
||||
|
||||
#define REG_MSGFILE_ROOT "SYSTEM\\CurrentControlSet\\Services\\EventLog\\"
|
||||
@ -40,29 +40,31 @@ static HANDLE win32_get_pointer(JNIEnv *env, jobject obj)
|
||||
return h;
|
||||
}
|
||||
|
||||
static int get_messagefile_dll(char *app, char *source, char *dllfile)
|
||||
static int get_messagefile_dll(const char *app, char *source, char *dllfile)
|
||||
{
|
||||
HKEY hk;
|
||||
DWORD type, data;
|
||||
char buf[MAX_MSG_LENGTH];
|
||||
LONG rc;
|
||||
|
||||
sprintf(buf, "%s%s\\%s", REG_MSGFILE_ROOT, app, source);
|
||||
|
||||
if (RegOpenKey(HKEY_LOCAL_MACHINE, buf, &hk)) {
|
||||
return GetLastError();
|
||||
rc = RegOpenKey(HKEY_LOCAL_MACHINE, buf, &hk);
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (RegQueryValueEx(hk, "EventMessageFile", NULL, &type,
|
||||
(UCHAR *)buf, &data)) {
|
||||
rc = RegQueryValueEx(hk, "EventMessageFile", NULL, &type,
|
||||
(UCHAR *)buf, &data);
|
||||
if (rc) {
|
||||
RegCloseKey(hk);
|
||||
return GetLastError();
|
||||
return rc;
|
||||
}
|
||||
|
||||
strncpy(dllfile, buf, sizeof(dllfile));
|
||||
|
||||
RegCloseKey(hk);
|
||||
|
||||
return 0;
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static int get_formatted_message(EVENTLOGRECORD *pevlr, char *dllfile,
|
||||
@ -163,11 +165,12 @@ JNIEXPORT jint SIGAR_JNI(win32_EventLog_getOldestRecord)
|
||||
}
|
||||
|
||||
JNIEXPORT jobject SIGAR_JNI(win32_EventLog_read)
|
||||
(JNIEnv *env, jobject obj, jint recordOffset)
|
||||
(JNIEnv *env, jobject obj, jstring jname, jint recordOffset)
|
||||
{
|
||||
EVENTLOGRECORD *pevlr;
|
||||
BYTE buffer[8192];
|
||||
char dllfile[1024];
|
||||
char msg[MAX_MSG_LENGTH];
|
||||
DWORD dwRead, dwNeeded;
|
||||
LPSTR source, machineName;
|
||||
HANDLE h;
|
||||
@ -175,6 +178,7 @@ JNIEXPORT jobject SIGAR_JNI(win32_EventLog_read)
|
||||
jclass cls = WIN32_FIND_CLASS("EventLogRecord");
|
||||
jobject eventObj; /* Actual instance of the EventLogRecord */
|
||||
jfieldID id;
|
||||
const char *name;
|
||||
|
||||
h = win32_get_pointer(env, obj);
|
||||
|
||||
@ -225,21 +229,22 @@ JNIEXPORT jobject SIGAR_JNI(win32_EventLog_read)
|
||||
source = (LPSTR)((LPBYTE)pevlr + sizeof(EVENTLOGRECORD));
|
||||
SetStringField(env, eventObj, id, source);
|
||||
|
||||
name = JENV->GetStringUTFChars(env, jname, 0);
|
||||
|
||||
/* Get the formatted message */
|
||||
if (!get_messagefile_dll("Application", source, dllfile)) {
|
||||
char msg[MAX_MSG_LENGTH];
|
||||
if (!get_formatted_message(pevlr, dllfile, msg)) {
|
||||
|
||||
id = JENV->GetFieldID(env, cls, "stringData",
|
||||
"Ljava/lang/String;");
|
||||
SetStringField(env, eventObj, id, msg);
|
||||
}
|
||||
if ((get_messagefile_dll(name, source, dllfile) == ERROR_SUCCESS) &&
|
||||
(get_formatted_message(pevlr, dllfile, msg) == ERROR_SUCCESS))
|
||||
{
|
||||
id = JENV->GetFieldID(env, cls, "stringData",
|
||||
"Ljava/lang/String;");
|
||||
SetStringField(env, eventObj, id, msg);
|
||||
} else if (pevlr->StringOffset > 0) {
|
||||
/* Work around some applications not using a message file */
|
||||
char *tmp = (LPSTR)((LPBYTE)pevlr + pevlr->StringOffset);
|
||||
id = JENV->GetFieldID(env, cls, "stringData", "Ljava/lang/String;");
|
||||
SetStringField(env, eventObj, id, tmp);
|
||||
}
|
||||
JENV->ReleaseStringUTFChars(env, jname, name);
|
||||
|
||||
/* Increment up to the machine name. */
|
||||
id = JENV->GetFieldID(env, cls, "computerName", "Ljava/lang/String;");
|
||||
|
@ -65,12 +65,13 @@ public class EventLog extends Win32 {
|
||||
* EVENTLOG_SEEK_READ flag, no sequential reading is currently
|
||||
* supported.
|
||||
*
|
||||
* @param logName The event log name
|
||||
* @param recordOffset The record offset to read.
|
||||
* @exception Win32Exception If the event log is not open, or
|
||||
* if the specified record could not be
|
||||
* found
|
||||
*/
|
||||
public native EventLogRecord read(int recordOffset)
|
||||
public native EventLogRecord read(String logName, int recordOffset)
|
||||
throws Win32Exception;
|
||||
|
||||
/**
|
||||
|
@ -101,7 +101,7 @@ public class EventLogThread implements Runnable {
|
||||
EventLogRecord record;
|
||||
|
||||
try {
|
||||
record = log.read(i);
|
||||
record = log.read(this.logName, i);
|
||||
} catch (Win32Exception e) {
|
||||
logger.error("Unable to read event id " + i + ": " + e);
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user