mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
425 lines
9.2 KiB
425 lines
9.2 KiB
/*++
|
|
|
|
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];
|
|
DWORD dwType;
|
|
|
|
//
|
|
// Get the display name for this resource.
|
|
//
|
|
BufSize = sizeof(ResourceName);
|
|
Status = ClusterRegQueryValue( hResourceKey,
|
|
CLUSREG_NAME_RES_NAME,
|
|
&dwType,
|
|
(LPBYTE)ResourceName,
|
|
&BufSize );
|
|
if (Status != ERROR_SUCCESS) {
|
|
ResourceName[0] = '\0';
|
|
} else {
|
|
ResourceName[79] = '\0';
|
|
}
|
|
|
|
ClusterLogEvent1(LogLevel,
|
|
LogModule,
|
|
FileName,
|
|
LineNumber,
|
|
MessageId,
|
|
dwByteCount,
|
|
lpBytes,
|
|
ResourceName);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
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];
|
|
DWORD dwType;
|
|
|
|
//
|
|
// Get the display name for this resource.
|
|
//
|
|
BufSize = sizeof(ResourceName);
|
|
Status = ClusterRegQueryValue( hResourceKey,
|
|
CLUSREG_NAME_RES_NAME,
|
|
&dwType,
|
|
(LPBYTE)ResourceName,
|
|
&BufSize );
|
|
if (Status != ERROR_SUCCESS) {
|
|
ResourceName[0] = '\0';
|
|
} else {
|
|
ResourceName[79] = '\0';
|
|
}
|
|
|
|
ClusterLogEvent2(LogLevel,
|
|
LogModule,
|
|
FileName,
|
|
LineNumber,
|
|
MessageId,
|
|
dwByteCount,
|
|
lpBytes,
|
|
ResourceName,
|
|
Arg1);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
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];
|
|
DWORD dwType;
|
|
|
|
//
|
|
// Get the display name for this resource.
|
|
//
|
|
BufSize = sizeof(ResourceName);
|
|
Status = ClusterRegQueryValue( hResourceKey,
|
|
CLUSREG_NAME_RES_NAME,
|
|
&dwType,
|
|
(LPBYTE)ResourceName,
|
|
&BufSize );
|
|
if (Status != ERROR_SUCCESS) {
|
|
ResourceName[0] = '\0';
|
|
} else {
|
|
ResourceName[79] = '\0';
|
|
}
|
|
|
|
ClusterLogEvent3(LogLevel,
|
|
LogModule,
|
|
FileName,
|
|
LineNumber,
|
|
MessageId,
|
|
dwByteCount,
|
|
lpBytes,
|
|
ResourceName,
|
|
Arg1,
|
|
Arg2);
|
|
|
|
return;
|
|
}
|
|
|