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
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 ));
|
|
}
|