/*++ Copyright (c) 1991-92 Microsoft Corporation Module Name: Alert.c Abstract: This file contains NetAlertRaise(). for the NetAlert API. Author: John Rogers (JohnRo) 03-Apr-1992 Environment: User Mode - Win32 Revision History: 04-Apr-1992 JohnRo Created NetAlertRaise() API from RitaW's AlTest (alerter svc test). 06-Apr-1992 JohnRo Added/improved error checking. 08-May-1992 JohnRo Quiet normal debug output. 08-May-1992 JohnRo Use equates. --*/ // These must be included first: #include // DWORD, CreateFile(), etc. #include // IN, NET_API_STATUS, etc. // These may be included in any order: #include // My prototype, ALERTER_MAILSLOT, LPSTD_ALERT, etc. #include // NO_ERROR, NERR_NoRoom, etc. #include // NetpKdPrint(()), FORMAT_ equates, etc. #include // PREFIX_ equates. #include // memcpy(). #include // NetpAlertStructureInfo(). #include // time_now(). #include // TCHAR_EOS. #if DBG #define IF_DEBUG( anything ) if (FALSE) #else #define IF_DEBUG( anything ) if (FALSE) #endif NET_API_STATUS NET_API_FUNCTION NetAlertRaise( IN LPCWSTR AlertType, IN LPVOID Buffer, IN DWORD BufferSize ) /*++ Routine Description: This routine raises an alert to notify the Alerter service by writing to the Alerter service mailslot. Arguments: AlertType - Supplies the name of the alert event which could be one of the three the Alerter service supports: ADMIN, USER, or PRINTING. The ALERT_xxx_EVENT equates are used to provide these strings. Buffer - Supplies the data to be written to the alert mailslot. This must begin with a STD_ALERT structure. BufferSize - Supplies the size in number of bytes of Buffer. Return Value: NET_API_STATUS - NO_ERROR or reason for failure. --*/ { NET_API_STATUS ApiStatus; HANDLE FileHandle; DWORD MaxTotalSize; DWORD NumberOfBytesWritten; DWORD RequiredFixedSize; // // Check for caller errors. // if (AlertType == NULL) { return (ERROR_INVALID_PARAMETER); } else if ( (*AlertType) == TCHAR_EOS ) { return (ERROR_INVALID_PARAMETER); } else if (Buffer == NULL) { return (ERROR_INVALID_PARAMETER); } ApiStatus = NetpAlertStructureInfo( (LPWSTR)AlertType, & MaxTotalSize, & RequiredFixedSize); if (ApiStatus != NO_ERROR) { return (ApiStatus); } if (BufferSize < ( sizeof(STD_ALERT) + RequiredFixedSize) ) { return (ERROR_INVALID_PARAMETER); } else if (BufferSize > MaxTotalSize) { return (ERROR_INVALID_PARAMETER); } // // Open the Alerter mailslot to write to it. // FileHandle = CreateFile( ALERTER_MAILSLOT, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); // no template file. if (FileHandle == INVALID_HANDLE_VALUE) { ApiStatus = (NET_API_STATUS) GetLastError(); IF_DEBUG( ALERT ) { NetpKdPrint(( PREFIX_NETAPI "NetAlertRaise: Problem with opening mailslot " FORMAT_API_STATUS "\n", ApiStatus )); } return (ApiStatus); } IF_DEBUG( ALERT ) { NetpKdPrint(( PREFIX_NETAPI "NetAlertRaise: " "Successfully opened the mailslot. Message (partial) is:\n")); NetpDbgHexDump( Buffer, NetpDbgReasonable(BufferSize) ); } // // Write alert notification to mailslot to be read by Alerter service. // if (WriteFile( FileHandle, Buffer, BufferSize, &NumberOfBytesWritten, NULL // no overlapped structure. ) == FALSE) { ApiStatus = (NET_API_STATUS) GetLastError(); NetpKdPrint(( PREFIX_NETAPI "NetAlertRaise: Error " FORMAT_API_STATUS " writing to mailslot.\n", ApiStatus )); } else { NetpAssert( NumberOfBytesWritten == BufferSize ); IF_DEBUG(ALERT) { NetpKdPrint(( PREFIX_NETAPI "NetAlertRaise: " "Successful in writing to mailslot; length " FORMAT_DWORD ", bytes written " FORMAT_DWORD "\n", BufferSize, NumberOfBytesWritten)); } } (VOID) CloseHandle(FileHandle); return (NO_ERROR); } // NetAlertRaise NET_API_STATUS NET_API_FUNCTION NetAlertRaiseEx( IN LPCWSTR AlertType, IN LPVOID VariableInfo, IN DWORD VariableInfoSize, IN LPCWSTR ServiceName ) /*++ Routine Description: This routine raises an alert to notify the Alerter service by writing to the Alerter service mailslot. Arguments: AlertType - Supplies the name of the alert event which could be one of the three the Alerter service supports: ADMIN, USER, or PRINTING. The ALERT_xxx_EVENT equates are used to provide these strings. VariableInfo - Supplies the variable length portion of the alert notification. VariableInfoSize - Supplies the size in number of bytes of the variable portion of the notification. ServiceName - Supplies the name of the service which raised the alert. Return Value: NET_API_STATUS - NO_ERROR or reason for failure. --*/ { #define TEMP_VARIABLE_SIZE (512-sizeof(STD_ALERT)) BYTE AlertMailslotBuffer[TEMP_VARIABLE_SIZE + sizeof(STD_ALERT)]; LPSTD_ALERT Alert = (LPSTD_ALERT) AlertMailslotBuffer; NET_API_STATUS ApiStatus; DWORD DataSize = VariableInfoSize + sizeof(STD_ALERT); // // Check for caller errors. // if (AlertType == NULL) { return (ERROR_INVALID_PARAMETER); } else if ( (*AlertType) == TCHAR_EOS ) { return (ERROR_INVALID_PARAMETER); } else if (VariableInfo == NULL) { return (ERROR_INVALID_PARAMETER); } else if (VariableInfoSize > TEMP_VARIABLE_SIZE) { return (NERR_NoRoom); } else if (ServiceName == NULL) { return (ERROR_INVALID_PARAMETER); } else if ( (*ServiceName) == TCHAR_EOS ) { return (ERROR_INVALID_PARAMETER); } // // Copy variable portion to end of our buffer. // (VOID) memcpy(ALERT_OTHER_INFO(Alert), VariableInfo, VariableInfoSize); // // Store current time in seconds since 1970. // Alert->alrt_timestamp = (DWORD) time_now(); // // Put alert event name into AlertMailslotBuffer // (VOID) STRCPY(Alert->alrt_eventname, AlertType); // // Put service name into AlertMailslotBuffer // (VOID) STRCPY(Alert->alrt_servicename, ServiceName); // // Write alert notification to mailslot to be read by Alerter service // ApiStatus = NetAlertRaise( AlertType, Alert, // buffer DataSize ); // buffer size return (ApiStatus); } // NetAlertRaiseEx