/*++ 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 )); }