Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1401 lines
38 KiB

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
ioctl.c
Abstract:
Implements server side of the resource and resource type
IOCTL interfaces in the CLUSAPI.
Author:
John Vert (jvert) 10/16/1996
Revision History:
--*/
#include "apip.h"
error_status_t
s_ApiNodeResourceControl(
IN HRES_RPC hResource,
IN HNODE_RPC hNode,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a resource.
Arguments:
hResource - Supplies a handle to the resource to be controlled.
hNode - Supplies a handle to the node on which the resource
control should be delivered. If this is NULL, the node where
the resource is online is used.
dwControlCode- Supplies the control code that defines the
structure and action of the resource control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the resource.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer..
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the resource..
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the resource..
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PFM_RESOURCE Resource;
PNM_NODE Node;
API_CHECK_INIT();
VALIDATE_RESOURCE_EXISTS(Resource, hResource);
VALIDATE_NODE(Node, hNode);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(FmResourceControl( Resource,
Node,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiResourceControl(
IN HRES_RPC hResource,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a resource.
Arguments:
hResource - Supplies a handle to the resource to be controlled.
dwControlCode- Supplies the control code that defines the
structure and action of the resource control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the resource.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer..
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the resource..
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the resource..
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PFM_RESOURCE Resource;
API_CHECK_INIT();
VALIDATE_RESOURCE_EXISTS(Resource, hResource);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(FmResourceControl( Resource,
NULL,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNodeResourceTypeControl(
IN HCLUSTER_RPC hCluster,
IN LPCWSTR lpszResourceTypeName,
IN HNODE_RPC hNode,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a resource type.
Arguments:
hCluster - Supplies a handle to the cluster to be controlled. Not used.
lpszResourceTypename - Supplies the name of the resource type to be
controlled.
hNode - Supplies a handle to the node on which the resource
control should be delivered. If this is NULL, the node where
the resource is online is used.
dwControlCode- Supplies the control code that defines the
structure and action of the resource type control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the resource.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer..
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the resource..
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the resource..
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PNM_NODE Node;
API_CHECK_INIT();
VALIDATE_NODE(Node, hNode);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK ) {
return (ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(FmResourceTypeControl( lpszResourceTypeName,
Node,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiResourceTypeControl(
IN HCLUSTER_RPC hCluster,
IN LPCWSTR lpszResourceTypeName,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a resource type.
Arguments:
hCluster - Supplies a handle to the cluster to be controlled. Not used.
lpszResourceTypename - Supplies the name of the resource type to be
controlled.
hNode - Supplies a handle to the node on which the resource
control should be delivered. If this is NULL, the node where
the resource is online is used.
dwControlCode- Supplies the control code that defines the
structure and action of the resource type control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the resource.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer..
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the resource..
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the resource..
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
API_CHECK_INIT();
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK ) {
return (ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(FmResourceTypeControl( lpszResourceTypeName,
NULL,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNodeGroupControl(
IN HGROUP_RPC hGroup,
IN HNODE_RPC hNode,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a group.
Arguments:
hGroup - Supplies a handle to the group to be controlled.
hNode - Supplies a handle to the node on which the group
control should be delivered. If this is NULL, the node where
the application is bound performs the request.
dwControlCode- Supplies the control code that defines the
structure and action of the group control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the group.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the group.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the group.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PFM_GROUP Group;
PNM_NODE Node;
API_CHECK_INIT();
VALIDATE_GROUP_EXISTS(Group, hGroup);
VALIDATE_NODE(Node, hNode);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK ) {
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(FmGroupControl( Group,
Node,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiGroupControl(
IN HGROUP_RPC hGroup,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a group.
Arguments:
hGroup - Supplies a handle to the group to be controlled.
dwControlCode- Supplies the control code that defines the
structure and action of the group control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the group.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the group.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the group.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PFM_GROUP Group;
API_CHECK_INIT();
VALIDATE_GROUP_EXISTS(Group, hGroup);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK ) {
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(FmGroupControl( Group,
NULL,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNodeNetworkControl(
IN HNETWORK_RPC hNetwork,
IN HNODE_RPC hNode,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a network.
Arguments:
hNetwork - Supplies a handle to the network to be controlled.
hNode - Supplies a handle to the node on which the network
control should be delivered. If this is NULL, the node where
the application is bound performs the request.
dwControlCode- Supplies the control code that defines the
structure and action of the network control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the network.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the network.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the network.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PNM_NETWORK Network;
PNM_NODE Node;
API_CHECK_INIT();
VALIDATE_NETWORK_EXISTS(Network, hNetwork);
VALIDATE_NODE(Node, hNode);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(NmNetworkControl(Network,
Node,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNetworkControl(
IN HNETWORK_RPC hNetwork,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a network.
Arguments:
hNetwork - Supplies a handle to the network to be controlled.
dwControlCode- Supplies the control code that defines the
structure and action of the network control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the network.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the network.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the network.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PNM_NETWORK Network;
API_CHECK_INIT();
VALIDATE_NETWORK_EXISTS(Network, hNetwork);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(NmNetworkControl(Network,
NULL,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNodeNetInterfaceControl(
IN HNETINTERFACE_RPC hNetInterface,
IN HNODE_RPC hNode,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a network interface.
Arguments:
hNetInterface - Supplies a handle to the network interface to be controlled.
hNode - Supplies a handle to the node on which the network
control should be delivered. If this is NULL, the node where
the application is bound performs the request.
dwControlCode- Supplies the control code that defines the
structure and action of the network control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the network.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the network.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the network.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PNM_INTERFACE NetInterface;
PNM_NODE Node;
API_CHECK_INIT();
VALIDATE_NETINTERFACE_EXISTS(NetInterface, hNetInterface);
VALIDATE_NODE(Node, hNode);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(NmInterfaceControl(NetInterface,
Node,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNetInterfaceControl(
IN HNETINTERFACE_RPC hNetInterface,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a network interface.
Arguments:
hNetInterface - Supplies a handle to the network interface to be controlled.
dwControlCode- Supplies the control code that defines the
structure and action of the network control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the network.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the network.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the network.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PNM_INTERFACE NetInterface;
API_CHECK_INIT();
VALIDATE_NETINTERFACE_EXISTS(NetInterface, hNetInterface);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(NmInterfaceControl(NetInterface,
NULL,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNodeNodeControl(
IN HNODE_RPC hNode,
IN HNODE_RPC hHostNode,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a node.
Arguments:
hNode - Supplies a handle to the node to be controlled.
hHostNode - Supplies a handle to the node on which the node
control should be delivered. If this is NULL, the node where
the application is bound performs the request.
dwControlCode- Supplies the control code that defines the
structure and action of the node control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the node.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the node.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the node.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PNM_NODE Node;
PNM_NODE HostNode;
API_CHECK_INIT();
VALIDATE_NODE(Node, hNode);
VALIDATE_NODE(HostNode, hHostNode);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(NmNodeControl( Node,
HostNode,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNodeControl(
IN HNODE_RPC hNode,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and a specific instance of a node.
Arguments:
hNode - Supplies a handle to the node to be controlled.
dwControlCode- Supplies the control code that defines the
structure and action of the node control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the node.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the node.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the node.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PNM_NODE Node;
API_CHECK_INIT();
VALIDATE_NODE(Node, hNode);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(NmNodeControl( Node,
NULL,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiNodeClusterControl(
IN HCLUSTER hCluster,
IN HNODE_RPC hHostNode,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and the cluster.
Arguments:
dwControlCode- Supplies the control code that defines the
structure and action of the cluster control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the cluster.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the cluster.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the cluster.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
PNM_NODE HostNode;
API_CHECK_INIT();
VALIDATE_NODE(HostNode, hHostNode);
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(CsClusterControl(
HostNode,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}
error_status_t
s_ApiClusterControl(
IN HCLUSTER hCluster,
IN DWORD dwControlCode,
IN UCHAR *lpInBuffer,
IN DWORD dwInBufferSize,
OUT UCHAR *lpOutBuffer,
IN DWORD nOutBufferSize,
OUT DWORD *lpBytesReturned,
OUT DWORD *lpcbRequired
)
/*++
Routine Description:
Provides for arbitrary communication and control between an application
and the cluster.
Arguments:
dwControlCode- Supplies the control code that defines the
structure and action of the cluster control.
Values of dwControlCode between 0 and 0x10000000 are reserved
for future definition and use by Microsoft. All other values
are available for use by ISVs.
lpInBuffer- Supplies a pointer to the input buffer to be passed
to the cluster.
nInBufferSize- Supplies the size, in bytes, of the data pointed
to by lpInBuffer.
lpOutBuffer- Supplies a pointer to the output buffer to be
filled in by the cluster.
nOutBufferSize- Supplies the size, in bytes, of the available
space pointed to by lpOutBuffer.
lpBytesReturned - Returns the number of bytes of lpOutBuffer
actually filled in by the cluster.
lpcbRequired - Returns the number of bytes required if OutBuffer
is not large enough.
Return Value:
ERROR_SUCCESS if successful
Win32 error code otherwise
--*/
{
API_CHECK_INIT();
//
// Check if this is an internal, private control code.
//
if ( dwControlCode & CLCTL_INTERNAL_MASK )
{
return(ERROR_PRIVILEGE_NOT_HELD);
}
//
// Since lpInBuffer is declared as [unique] in the IDL file, it can be NULL while dwBufferSize
// is non-zero and vice-versa. To avoid confusion in the following code, we make them consistent
// right here.
//
if ( lpInBuffer == NULL )
{
dwInBufferSize = 0;
}
else if ( dwInBufferSize == 0 )
{
lpInBuffer = NULL;
}
return(CsClusterControl(
NULL,
dwControlCode,
lpInBuffer,
dwInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned,
lpcbRequired ));
}