blob: 3751b91b208050a7cbffffffda4cc3f1c685dbea (
plain) (
tree)
|
|
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
ALERT.C
Abstract:
This file contains the routine that sends the alert to the admin.
Author:
Rajen Shah (rajens) 28-Aug-1991
Revision History:
--*/
//
// INCLUDES
//
#include <eventp.h>
#include <string.h>
#include <lmalert.h> // LAN Manager alert structures
BOOL
SendAdminAlert (
ULONG MessageID,
ULONG NumStrings,
UNICODE_STRING *pStrings
)
/*++
Routine Description:
This routine raises an ADMIN alert with the message specified.
Arguments:
MessageID - Message ID.
NumStrings - Number of replacement strings.
pStrings - Array of UNICODE_STRING Replacement strings.
Return Value:
NONE
Note:
This routine dynamically links to netapi32.dll to avoid a build
dependency.
--*/
{
typedef DWORD (*ALERT_FNC_PTR)(
IN LPTSTR AlertEventName,
IN LPVOID VariableInfo,
IN DWORD VariableInfoSize,
IN LPTSTR ServiceName
);
NET_API_STATUS NetStatus;
BYTE AlertBuffer[ELF_ADMIN_ALERT_BUFFER_SIZE + sizeof(ADMIN_OTHER_INFO)];
ADMIN_OTHER_INFO UNALIGNED *VariableInfo = (PADMIN_OTHER_INFO) AlertBuffer;
DWORD DataSize;
DWORD i;
LPWSTR pReplaceString;
HANDLE dllHandle;
ALERT_FNC_PTR AlertFunction;
//
// Dynamically link to netapi.dll. If it's not there just return. Return
// TRUE so we won't try to send this alert again.
//
dllHandle = LoadLibraryA("NetApi32.Dll");
if ( dllHandle == INVALID_HANDLE_VALUE ) {
ElfDbgPrint(("[ELF] Failed to load DLL NetApi32.Dll: %ld\n",
GetLastError()));
return(TRUE);
}
//
// Get the address of the service's main entry point. This
// entry point has a well-known name.
//
AlertFunction = (ALERT_FNC_PTR)GetProcAddress(
dllHandle,
"NetAlertRaiseEx"
);
if (AlertFunction == NULL ) {
ElfDbgPrint(("[ELF] Can't find entry NetAlertRaiseEx in NetApi32.Dll: %ld\n",
GetLastError()));
return(TRUE);
}
VariableInfo->alrtad_errcode = MessageID;
VariableInfo->alrtad_numstrings = NumStrings;
pReplaceString = (LPWSTR)(AlertBuffer + sizeof(ADMIN_OTHER_INFO));
//
// Copy over the replacement strings
//
for (i = 0; i < NumStrings; i++) {
RtlMoveMemory(pReplaceString, pStrings[i].Buffer,
pStrings[i].MaximumLength);
pReplaceString = (LPWSTR) ((PBYTE) pReplaceString +
pStrings[i].MaximumLength);
}
DataSize = (PBYTE) pReplaceString - (PBYTE) AlertBuffer;
NetStatus = (*AlertFunction)(ALERT_ADMIN_EVENT, AlertBuffer, DataSize,
wname_Eventlogsvc);
if (NetStatus != NERR_Success) {
ElfDbgPrint(("[ELF] NetAlertRaiseEx failed with %d\n", NetStatus));
ElfDbgPrint(("[ELF] Attempted to raise alert %d\n", MessageID));
//
// Probably just not started yet, try again later
//
return(FALSE);
}
return(TRUE);
}
|