572 lines
13 KiB
C
572 lines
13 KiB
C
/*++
|
||
|
||
Copyright (c) 1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
utils.c
|
||
|
||
Abstract:
|
||
|
||
Common utility routines for clusters resources
|
||
|
||
Author:
|
||
|
||
John Vert (jvert) 12/15/1996
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
#include "clusres.h"
|
||
#include "clusrtl.h"
|
||
#include "clusudef.h"
|
||
|
||
|
||
|
||
DWORD
|
||
ClusResOpenDriver(
|
||
HANDLE *Handle,
|
||
LPWSTR DriverName
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function opens a specified IO drivers.
|
||
|
||
Arguments:
|
||
|
||
Handle - pointer to location where the opened drivers handle is
|
||
returned.
|
||
|
||
DriverName - name of the driver to be opened.
|
||
|
||
Return Value:
|
||
|
||
Windows Error Code.
|
||
|
||
--*/
|
||
{
|
||
OBJECT_ATTRIBUTES objectAttributes;
|
||
IO_STATUS_BLOCK ioStatusBlock;
|
||
UNICODE_STRING nameString;
|
||
NTSTATUS status;
|
||
|
||
*Handle = NULL;
|
||
|
||
//
|
||
// Open a Handle to the IP driver.
|
||
//
|
||
|
||
RtlInitUnicodeString(&nameString, DriverName);
|
||
|
||
InitializeObjectAttributes(
|
||
&objectAttributes,
|
||
&nameString,
|
||
OBJ_CASE_INSENSITIVE,
|
||
(HANDLE) NULL,
|
||
(PSECURITY_DESCRIPTOR) NULL
|
||
);
|
||
|
||
status = NtCreateFile(
|
||
Handle,
|
||
SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA,
|
||
&objectAttributes,
|
||
&ioStatusBlock,
|
||
NULL,
|
||
FILE_ATTRIBUTE_NORMAL,
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
FILE_OPEN_IF,
|
||
0,
|
||
NULL,
|
||
0
|
||
);
|
||
|
||
return( RtlNtStatusToDosError( status ) );
|
||
|
||
} // ClusResOpenDriver
|
||
|
||
|
||
|
||
NTSTATUS
|
||
ClusResDoIoctl(
|
||
HANDLE Handle,
|
||
DWORD IoctlCode,
|
||
PVOID Request,
|
||
DWORD RequestSize,
|
||
PVOID Response,
|
||
PDWORD ResponseSize
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Utility routine used to issue a filtering ioctl to the tcpip driver.
|
||
|
||
Arguments:
|
||
|
||
Handle - An open file handle on which to issue the request.
|
||
|
||
IoctlCode - The IOCTL opcode.
|
||
|
||
Request - A pointer to the input buffer.
|
||
|
||
RequestSize - Size of the input buffer.
|
||
|
||
Response - A pointer to the output buffer.
|
||
|
||
ResponseSize - On input, the size in bytes of the output buffer.
|
||
On output, the number of bytes returned in the output buffer.
|
||
|
||
Return Value:
|
||
|
||
NT Status Code.
|
||
|
||
--*/
|
||
{
|
||
IO_STATUS_BLOCK ioStatusBlock;
|
||
NTSTATUS status;
|
||
|
||
|
||
ioStatusBlock.Information = 0;
|
||
|
||
status = NtDeviceIoControlFile(
|
||
Handle, // Driver handle
|
||
NULL, // Event
|
||
NULL, // APC Routine
|
||
NULL, // APC context
|
||
&ioStatusBlock, // Status block
|
||
IoctlCode, // Control code
|
||
Request, // Input buffer
|
||
RequestSize, // Input buffer size
|
||
Response, // Output buffer
|
||
*ResponseSize // Output buffer size
|
||
);
|
||
|
||
if (status == STATUS_PENDING) {
|
||
status = NtWaitForSingleObject(
|
||
Handle,
|
||
TRUE,
|
||
NULL
|
||
);
|
||
}
|
||
|
||
if (status == STATUS_SUCCESS) {
|
||
status = ioStatusBlock.Status;
|
||
*ResponseSize = (DWORD)ioStatusBlock.Information;
|
||
}
|
||
else {
|
||
*ResponseSize = 0;
|
||
}
|
||
|
||
return(status);
|
||
|
||
} // ClusResDoIoctl
|
||
|
||
|
||
VOID
|
||
ClusResLogEventWithName0(
|
||
IN HKEY hResourceKey,
|
||
IN DWORD LogLevel,
|
||
IN DWORD LogModule,
|
||
IN LPSTR FileName,
|
||
IN DWORD LineNumber,
|
||
IN DWORD MessageId,
|
||
IN DWORD dwByteCount,
|
||
IN PVOID lpBytes
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Logs an event to the eventlog. The display name of the resource is retrieved
|
||
and passed as the first insertion string.
|
||
|
||
Arguments:
|
||
|
||
hResourceKey - Supplies the cluster resource key.
|
||
|
||
LogLevel - Supplies the logging level, one of
|
||
LOG_CRITICAL 1
|
||
LOG_UNUSUAL 2
|
||
LOG_NOISE 3
|
||
|
||
LogModule - Supplies the module ID.
|
||
|
||
FileName - Supplies the filename of the caller
|
||
|
||
LineNumber - Supplies the line number of the caller
|
||
|
||
MessageId - Supplies the message ID to be logged.
|
||
|
||
dwByteCount - Supplies the number of error-specific bytes to log. If this
|
||
is zero, lpBytes is ignored.
|
||
|
||
lpBytes - Supplies the error-specific bytes to log.
|
||
|
||
Return Value:
|
||
|
||
ERROR_SUCCESS if successful
|
||
|
||
Win32 error code otherwise
|
||
|
||
--*/
|
||
|
||
{
|
||
DWORD BufSize;
|
||
DWORD Status;
|
||
WCHAR ResourceName[80];
|
||
PWCHAR resName = ResourceName;
|
||
DWORD dwType;
|
||
|
||
//
|
||
// Get the display name for this resource.
|
||
//
|
||
BufSize = sizeof( ResourceName );
|
||
|
||
again:
|
||
Status = ClusterRegQueryValue( hResourceKey,
|
||
CLUSREG_NAME_RES_NAME,
|
||
&dwType,
|
||
(LPBYTE)resName,
|
||
&BufSize );
|
||
|
||
if ( Status == ERROR_MORE_DATA ) {
|
||
resName = LocalAlloc( LMEM_FIXED, BufSize );
|
||
if ( resName != NULL ) {
|
||
goto again;
|
||
}
|
||
|
||
resName = ResourceName;
|
||
ResourceName[0] = UNICODE_NULL;
|
||
} else if ( Status != ERROR_SUCCESS ) {
|
||
ResourceName[0] = '\0';
|
||
}
|
||
|
||
ClusterLogEvent1(LogLevel,
|
||
LogModule,
|
||
FileName,
|
||
LineNumber,
|
||
MessageId,
|
||
dwByteCount,
|
||
lpBytes,
|
||
resName);
|
||
|
||
if ( resName != ResourceName ) {
|
||
LocalFree( resName );
|
||
}
|
||
|
||
return;
|
||
|
||
} // ClusResLogEventWithName0
|
||
|
||
|
||
VOID
|
||
ClusResLogEventWithName1(
|
||
IN HKEY hResourceKey,
|
||
IN DWORD LogLevel,
|
||
IN DWORD LogModule,
|
||
IN LPSTR FileName,
|
||
IN DWORD LineNumber,
|
||
IN DWORD MessageId,
|
||
IN DWORD dwByteCount,
|
||
IN PVOID lpBytes,
|
||
IN LPCWSTR Arg1
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Logs an event to the eventlog. The display name of the resource is retrieved
|
||
and passed as the first insertion string.
|
||
|
||
Arguments:
|
||
|
||
hResourceKey - Supplies the cluster resource key.
|
||
|
||
LogLevel - Supplies the logging level, one of
|
||
LOG_CRITICAL 1
|
||
LOG_UNUSUAL 2
|
||
LOG_NOISE 3
|
||
|
||
LogModule - Supplies the module ID.
|
||
|
||
FileName - Supplies the filename of the caller
|
||
|
||
LineNumber - Supplies the line number of the caller
|
||
|
||
MessageId - Supplies the message ID to be logged.
|
||
|
||
dwByteCount - Supplies the number of error-specific bytes to log. If this
|
||
is zero, lpBytes is ignored.
|
||
|
||
lpBytes - Supplies the error-specific bytes to log.
|
||
|
||
Arg1 - Supplies an insertion string
|
||
|
||
Return Value:
|
||
|
||
ERROR_SUCCESS if successful
|
||
|
||
Win32 error code otherwise
|
||
|
||
--*/
|
||
|
||
{
|
||
DWORD BufSize;
|
||
DWORD Status;
|
||
WCHAR ResourceName[80];
|
||
PWCHAR resName = ResourceName;
|
||
DWORD dwType;
|
||
|
||
//
|
||
// Get the display name for this resource.
|
||
//
|
||
BufSize = sizeof( ResourceName );
|
||
|
||
again:
|
||
Status = ClusterRegQueryValue( hResourceKey,
|
||
CLUSREG_NAME_RES_NAME,
|
||
&dwType,
|
||
(LPBYTE)resName,
|
||
&BufSize );
|
||
|
||
if ( Status == ERROR_MORE_DATA ) {
|
||
resName = LocalAlloc( LMEM_FIXED, BufSize );
|
||
if ( resName != NULL ) {
|
||
goto again;
|
||
}
|
||
|
||
resName = ResourceName;
|
||
ResourceName[0] = UNICODE_NULL;
|
||
} else if ( Status != ERROR_SUCCESS ) {
|
||
ResourceName[0] = '\0';
|
||
}
|
||
|
||
ClusterLogEvent2(LogLevel,
|
||
LogModule,
|
||
FileName,
|
||
LineNumber,
|
||
MessageId,
|
||
dwByteCount,
|
||
lpBytes,
|
||
resName,
|
||
Arg1);
|
||
|
||
if ( resName != ResourceName ) {
|
||
LocalFree( resName );
|
||
}
|
||
|
||
return;
|
||
} // ClusResLogEventWithName1
|
||
|
||
VOID
|
||
ClusResLogEventWithName2(
|
||
IN HKEY hResourceKey,
|
||
IN DWORD LogLevel,
|
||
IN DWORD LogModule,
|
||
IN LPSTR FileName,
|
||
IN DWORD LineNumber,
|
||
IN DWORD MessageId,
|
||
IN DWORD dwByteCount,
|
||
IN PVOID lpBytes,
|
||
IN LPCWSTR Arg1,
|
||
IN LPCWSTR Arg2
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Logs an event to the eventlog. The display name of the resource is retrieved
|
||
and passed as the first insertion string.
|
||
|
||
Arguments:
|
||
|
||
hResourceKey - Supplies the cluster resource key.
|
||
|
||
LogLevel - Supplies the logging level, one of
|
||
LOG_CRITICAL 1
|
||
LOG_UNUSUAL 2
|
||
LOG_NOISE 3
|
||
|
||
LogModule - Supplies the module ID.
|
||
|
||
FileName - Supplies the filename of the caller
|
||
|
||
LineNumber - Supplies the line number of the caller
|
||
|
||
MessageId - Supplies the message ID to be logged.
|
||
|
||
dwByteCount - Supplies the number of error-specific bytes to log. If this
|
||
is zero, lpBytes is ignored.
|
||
|
||
lpBytes - Supplies the error-specific bytes to log.
|
||
|
||
Arg1 - Supplies an insertion string
|
||
|
||
Arg2 - Supplies the second insertion string
|
||
|
||
Return Value:
|
||
|
||
ERROR_SUCCESS if successful
|
||
|
||
Win32 error code otherwise
|
||
|
||
--*/
|
||
|
||
{
|
||
DWORD BufSize;
|
||
DWORD Status;
|
||
WCHAR ResourceName[80];
|
||
PWCHAR resName = ResourceName;
|
||
DWORD dwType;
|
||
|
||
//
|
||
// Get the display name for this resource.
|
||
//
|
||
BufSize = sizeof( ResourceName );
|
||
|
||
again:
|
||
Status = ClusterRegQueryValue( hResourceKey,
|
||
CLUSREG_NAME_RES_NAME,
|
||
&dwType,
|
||
(LPBYTE)resName,
|
||
&BufSize );
|
||
|
||
if ( Status == ERROR_MORE_DATA ) {
|
||
resName = LocalAlloc( LMEM_FIXED, BufSize );
|
||
if ( resName != NULL ) {
|
||
goto again;
|
||
}
|
||
|
||
resName = ResourceName;
|
||
ResourceName[0] = UNICODE_NULL;
|
||
} else if ( Status != ERROR_SUCCESS ) {
|
||
ResourceName[0] = '\0';
|
||
}
|
||
|
||
ClusterLogEvent3(LogLevel,
|
||
LogModule,
|
||
FileName,
|
||
LineNumber,
|
||
MessageId,
|
||
dwByteCount,
|
||
lpBytes,
|
||
resName,
|
||
Arg1,
|
||
Arg2);
|
||
|
||
if ( resName != ResourceName ) {
|
||
LocalFree( resName );
|
||
}
|
||
|
||
return;
|
||
} // ClusResLogEventWithName2
|
||
|
||
VOID
|
||
ClusResLogEventWithName3(
|
||
IN HKEY hResourceKey,
|
||
IN DWORD LogLevel,
|
||
IN DWORD LogModule,
|
||
IN LPSTR FileName,
|
||
IN DWORD LineNumber,
|
||
IN DWORD MessageId,
|
||
IN DWORD dwByteCount,
|
||
IN PVOID lpBytes,
|
||
IN LPCWSTR Arg1,
|
||
IN LPCWSTR Arg2,
|
||
IN LPCWSTR Arg3
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Logs an event to the eventlog. The display name of the resource is retrieved
|
||
and passed as the first insertion string.
|
||
|
||
Arguments:
|
||
|
||
hResourceKey - Supplies the cluster resource key.
|
||
|
||
LogLevel - Supplies the logging level, one of
|
||
LOG_CRITICAL 1
|
||
LOG_UNUSUAL 2
|
||
LOG_NOISE 3
|
||
|
||
LogModule - Supplies the module ID.
|
||
|
||
FileName - Supplies the filename of the caller
|
||
|
||
LineNumber - Supplies the line number of the caller
|
||
|
||
MessageId - Supplies the message ID to be logged.
|
||
|
||
dwByteCount - Supplies the number of error-specific bytes to log. If this
|
||
is zero, lpBytes is ignored.
|
||
|
||
lpBytes - Supplies the error-specific bytes to log.
|
||
|
||
Arg1 - Supplies an insertion string
|
||
|
||
Arg2 - Supplies the second insertion string
|
||
|
||
Arg3 - Supplies the third insertion string
|
||
|
||
Return Value:
|
||
|
||
ERROR_SUCCESS if successful
|
||
|
||
Win32 error code otherwise
|
||
|
||
--*/
|
||
|
||
{
|
||
DWORD BufSize;
|
||
DWORD Status;
|
||
WCHAR ResourceName[80];
|
||
PWCHAR resName = ResourceName;
|
||
DWORD dwType;
|
||
|
||
//
|
||
// Get the display name for this resource.
|
||
//
|
||
BufSize = sizeof( ResourceName );
|
||
|
||
again:
|
||
Status = ClusterRegQueryValue( hResourceKey,
|
||
CLUSREG_NAME_RES_NAME,
|
||
&dwType,
|
||
(LPBYTE)resName,
|
||
&BufSize );
|
||
|
||
if ( Status == ERROR_MORE_DATA ) {
|
||
resName = LocalAlloc( LMEM_FIXED, BufSize );
|
||
if ( resName != NULL ) {
|
||
goto again;
|
||
}
|
||
|
||
resName = ResourceName;
|
||
ResourceName[0] = UNICODE_NULL;
|
||
} else if ( Status != ERROR_SUCCESS ) {
|
||
ResourceName[0] = '\0';
|
||
}
|
||
|
||
ClusterLogEvent4(LogLevel,
|
||
LogModule,
|
||
FileName,
|
||
LineNumber,
|
||
MessageId,
|
||
dwByteCount,
|
||
lpBytes,
|
||
resName,
|
||
Arg1,
|
||
Arg2,
|
||
Arg3);
|
||
|
||
if ( resName != ResourceName ) {
|
||
LocalFree( resName );
|
||
}
|
||
|
||
return;
|
||
}
|