/*++ Copyright (C) Microsoft Corporation, 1992 - 1999 Module Name: nsimgmt.cxx Abstract: This is the module implements the client side support for management APIs. Author: Steven Zeck (stevez) 04/23/92 --*/ #include #include RPC_STATUS RPC_ENTRY I_NsBindingFoundBogus(RPC_BINDING_HANDLE *BindingHandle, DWORD BindId); RPC_STATUS RPC_ENTRY I_NsClientBindSearch(RPC_BINDING_HANDLE *NsiClntBinding, DWORD *BindId); void RPC_ENTRY I_NsClientBindDone(RPC_BINDING_HANDLE *NsiClntBinding, DWORD BindId); RPC_STATUS RPC_ENTRY RpcNsGroupDeleteW( IN unsigned long GroupNameSyntax, IN unsigned short __RPC_FAR * GroupName ) /*++ Routine Description: Remove a group entry and all its member items. Arguments: GroupNameSyntax - This value describes the type/format of the GroupName. GroupName - Name that will be deleted. Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_group_delete() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! GroupNameSyntax) GroupNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_group_delete(NsiClntBinding, GroupNameSyntax, GroupName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(NsiMapStatus(NsiStatus)); } RPC_STATUS RPC_ENTRY RpcNsGroupMbrAddW( IN unsigned long GroupNameSyntax, IN unsigned short __RPC_FAR * GroupName, IN unsigned long MemberNameSyntax, IN unsigned short __RPC_FAR * MemberName ) /*++ Routine Description: Add a new member to a group entry. Create the group entry on demand. Arguments: GroupNameSyntax - This value describes the type/format of the GroupName. GroupName - Name of the group that the member will be added to. MemberNameSyntax - This value describes the type/format of the MemberName. MemberName - Name of member in the group that will be added. Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_group_mbr_add() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! GroupNameSyntax) GroupNameSyntax = DefaultSyntax; if (! MemberNameSyntax) MemberNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_group_mbr_add(NsiClntBinding, GroupNameSyntax, GroupName, MemberNameSyntax, MemberName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsGroupMbrRemoveW( IN unsigned long GroupNameSyntax, IN unsigned short __RPC_FAR * GroupName, IN unsigned long MemberNameSyntax, IN unsigned short __RPC_FAR * MemberName ) /*++ Routine Description: Arguments: GroupNameSyntax - This value describes the type/format of the GroupName. GroupName - Name of the group that the member will be deleted from. MemberNameSyntax - This value describes the type/format of the MemberName. MemberName - Name of member in the group that will be deleted Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_group_mbr_remove() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! GroupNameSyntax) GroupNameSyntax = DefaultSyntax; if (! MemberNameSyntax) MemberNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_group_mbr_remove(NsiClntBinding, GroupNameSyntax, GroupName, MemberNameSyntax, MemberName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return status; } RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqBeginW( IN unsigned long GroupNameSyntax, IN unsigned short __RPC_FAR * GroupName, IN unsigned long MemberNameSyntax, OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: Begin a inquiry to enumerate all the members in a group entry. Arguments: GroupNameSyntax - This value describes the type/format of the GroupName. GroupName - Name of the group that the member will be deleted from. MemberNameSyntax - This controls what format the name is returned in. InquiryContext - context handle for RpcNsGroupMbrInqNextW Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_group_mbr_inq_begin() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; *InquiryContext = 0; if (! GroupNameSyntax) GroupNameSyntax = DefaultSyntax; if (! MemberNameSyntax) MemberNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_group_mbr_inq_begin(NsiClntBinding, GroupNameSyntax, GroupName, MemberNameSyntax, InquiryContext, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return status; } RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqNextW( OUT RPC_NS_HANDLE InquiryContext, OUT unsigned short __RPC_FAR * __RPC_FAR * MemberName ) /*++ Routine Description: Get the next member in a group entry. Arguments: InquiryContext - context handle from RpcNsGroupMbrInqBeginW MemberName - pointer to return results. Returns: nsi_group_mbr_inq_next() --*/ { UNSIGNED16 NsiStatus; *MemberName = 0; RpcTryExcept { nsi_group_mbr_inq_next(InquiryContext, MemberName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept return(NsiMapStatus(NsiStatus)); } RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqDone( OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: Finish enumerating the members of a group. Arguments: InquiryContext - context handle from RpcNsGroupMbrInqBeginW Returns: nsi_group_mbr_inq_done() --*/ { UNSIGNED16 NsiStatus; RpcTryExcept { nsi_group_mbr_inq_done(InquiryContext, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept return(NsiMapStatus(NsiStatus)); } RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqBeginW( IN unsigned long EntryNameSyntax, IN unsigned short __RPC_FAR * EntryName, OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: Begin a inquiry to enumerate all the UUID objects in a server entry. Arguments: EntryNameSyntax - This value describes the type/format of the EntryName. EntryName - Name of the server entry to inquiry. InquiryContext - context handle for RpcNsGroupMbrInqNextW Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_entry_object_inq_begin() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; *InquiryContext = 0; if (! EntryNameSyntax) EntryNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_entry_object_inq_begin(NsiClntBinding, EntryNameSyntax, EntryName, InquiryContext, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return status; } RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqNext( IN RPC_NS_HANDLE InquiryContext, OUT UUID __RPC_FAR * ObjUuid ) /*++ Routine Description: Gets the next object UUID in the server entry. Arguments: InquiryContext - context handle from RpcNsEntryObjectInqBeginW ObjUuid - pointer to memory to return results Returns: nsi_entry_object_inq_next() --*/ { UNSIGNED16 NsiStatus; RpcTryExcept { nsi_entry_object_inq_next(InquiryContext, (NSI_UUID_T *) ObjUuid, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept return(NsiMapStatus(NsiStatus)); } RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqDone( OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: Finish enumerating the objects of a server entry. Arguments: InquiryContext - context handle from RpcNsEntryObjectInqBeginW Returns: nsi_entry_object_inq_done() --*/ { UNSIGNED16 NsiStatus; RpcTryExcept { nsi_entry_object_inq_done(InquiryContext, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept return(NsiMapStatus(NsiStatus)); } RPC_STATUS RPC_ENTRY RpcNsMgmtInqExpAge( OUT unsigned long *ExpirationAge ) /*++ Routine Description: Get the global time that a cached entry remains valide. Arguments: ExpirationAge - place to expiration age in seconds Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_mgmt_inq_exp_age() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_mgmt_inq_exp_age(NsiClntBinding, ExpirationAge, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return status; } RPC_STATUS RPC_ENTRY RpcNsMgmtSetExpAge( IN unsigned long ExpirationAge ) /*++ Routine Description: set the global time that a cached entry remains valide. Arguments: ExpirationAge - new expiration age in seconds Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_mgmt_set_exp_age() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_mgmt_inq_set_age(NsiClntBinding, ExpirationAge, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return status; } RPC_STATUS RPC_ENTRY RpcNsEntryExpandNameW( IN unsigned long EntryNameSyntax, IN unsigned short __RPC_FAR * EntryName, OUT unsigned short __RPC_FAR * __RPC_FAR * ExpandedName ) /*++ Routine Description: Arguments: EntryNameSyntax - This value describes the type/format of the EntryName. EntryName - Name that will be expanded. ExpandedName - fully quailified global name. Returns: --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! EntryNameSyntax) EntryNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_entry_expand_name(NsiClntBinding, EntryNameSyntax, EntryName, ExpandedName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsMgmtBindingUnexportW( IN unsigned long EntryNameSyntax, IN unsigned short * EntryName, IN RPC_IF_ID * IfId, OPTIONAL IN unsigned long VersOption, OPTIONAL IN UUID_VECTOR * ObjectUuidVec OPTIONAL ) /*++ Routine Description: Remove interfaces and or objects from an server entry. Arguments: EntryNameSyntax - This value describes the type/format of the EntryName. EntryName - The server name that will be unexported. IfId - The interface to unexport, NIL means objects only. VersOption - constrains which interfaces to remove ObjectUuidVec - list of objects to remove in combination with interface. Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_mgmt_binding_unexport() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! EntryNameSyntax) EntryNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_mgmt_binding_unexport(NsiClntBinding, EntryNameSyntax, EntryName, (NSI_IF_ID_P_T) IfId, VersOption, (NSI_UUID_VECTOR_T *)ObjectUuidVec, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsMgmtEntryCreateW( IN unsigned long EntryNameSyntax, IN unsigned short * EntryName ) /*++ Routine Description: Create an entry name that is empty. It has no type and becomes a type according to the first add API aplied (profile, groupd, server). Arguments: EntryNameSyntax - This value describes the type/format of the EntryName. EntryName - Name of the new entry. Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_mgmt_entry_Create() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! EntryNameSyntax) EntryNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_mgmt_entry_create(NsiClntBinding, EntryNameSyntax, EntryName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsMgmtEntryDeleteW( IN unsigned long EntryNameSyntax, IN unsigned short * EntryName ) /*++ Routine Description: Remove an entry name (server, group or profile). Arguments: EntryNameSyntax - This value describes the type/format of the EntryName. EntryName - Name that this export will be stored in. This is just a token that is passed on the the Name Server. Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_mgmt_entry_delete() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! EntryNameSyntax) EntryNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_mgmt_entry_delete(NsiClntBinding, EntryNameSyntax, EntryName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsMgmtEntryInqIfIdsW( IN unsigned long EntryNameSyntax, IN unsigned short * EntryName, OUT RPC_IF_ID_VECTOR ** IfIdVec ) /*++ Routine Description: Get all the interface identifiers in a server entry. Arguments: EntryNameSyntax - This value describes the type/format of the EntryName. EntryName - Name that this export will be stored in. This is just a token that is passed on the the Name Server. IfIdVec - pointer to return results in Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_mgmt_entry_inq_ifids() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! EntryNameSyntax) EntryNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { *IfIdVec = 0; RpcTryExcept { nsi_mgmt_entry_inq_if_ids(NsiClntBinding, EntryNameSyntax, EntryName, (NSI_IF_ID_VECTOR_T **) IfIdVec, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsProfileDeleteW( IN unsigned long ProfileNameSyntax, IN unsigned short __RPC_FAR * ProfileName ) /*++ Routine Description: Remove a profile entry and all its member items. Arguments: profileNameSyntax - This value describes the type/format of the profile ame. profileName - Name that will be deleted. Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_profile_delete() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! ProfileNameSyntax) ProfileNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_profile_delete(NsiClntBinding, ProfileNameSyntax, ProfileName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsProfileEltAddW( IN unsigned long ProfileNameSyntax, IN unsigned short __RPC_FAR * ProfileName, IN RPC_IF_ID * IfId, IN unsigned long MemberNameSyntax, IN unsigned short __RPC_FAR * MemberName, IN unsigned long Priority, IN unsigned short __RPC_FAR * Annotation ) /*++ Routine Description: Add elements to the profile entry Arguments: ProfileNameSyntax - This value describes the type/format of the ProfileName. ProfileName - The server name that will be unexported. IfId - The interface to unexport, NIL means objects only. MemberNameSyntax - This value describes the type/format of the MemberName. MemberName - The server name that will be unexported. Priority - Place to insert member in profile Annotation - comment for member Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_profile_elt_add() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! ProfileNameSyntax) ProfileNameSyntax = DefaultSyntax; if (! MemberNameSyntax) MemberNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_profile_elt_add(NsiClntBinding, ProfileNameSyntax, ProfileName, (NSI_IF_ID_P_T) IfId, MemberNameSyntax, MemberName, Priority, Annotation, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsProfileEltRemoveW( IN unsigned long ProfileNameSyntax, IN unsigned short __RPC_FAR * ProfileName, IN RPC_IF_ID * IfId, IN unsigned long MemberNameSyntax, IN unsigned short __RPC_FAR * MemberName ) /*++ Routine Description: Remove an element from a profile entry. Arguments: ProfileNameSyntax - This value describes the type/format of the ProfileName. ProfileName - The server name that will be unexported. IfId - The interface to unexport, NIL means objects only. MemberNameSyntax - This value describes the type/format of the MemberName. MemberName - The server name that will be unexported. Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_mgmt_binding_unexport() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (! ProfileNameSyntax) ProfileNameSyntax = DefaultSyntax; if (! MemberNameSyntax) MemberNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_profile_elt_remove(NsiClntBinding, ProfileNameSyntax, ProfileName, (NSI_IF_ID_P_T) IfId, MemberNameSyntax, MemberName, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsProfileEltInqBeginW( IN unsigned long ProfileNameSyntax, IN unsigned short __RPC_FAR * ProfileName, IN unsigned long InquiryType, IN RPC_IF_ID * IfId, IN unsigned long VersOption, IN unsigned long MemberNameSyntax, IN unsigned short __RPC_FAR * MemberName, OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: Remove an element from a profile entry. Arguments: ProfileNameSyntax - This value describes the type/format of the ProfileName. ProfileName - The server name that will be unexported. InquiryType - Type of inquiry, one of RpcCProfile* constants IfId - The interface to unexport, NIL means objects only. VersOption - Version options, one of RpcCVers* constants MemberNameSyntax - This value describes the type/format of the MemberName. MemberName - The server name that will be unexported. InquiryContext - context handle for use wiht RpcNsProfileEltInqNextW Returns: NSI_S_NAME_SERVICE_UNAVAILABLE, nsi_profile_elt_inq_begin() --*/ { RPC_STATUS status; UNSIGNED16 NsiStatus; RPC_BINDING_HANDLE NsiClntBinding = NULL; DWORD BindId = 0; if (InquiryContext) *InquiryContext = NULL; if (! ProfileNameSyntax) ProfileNameSyntax = DefaultSyntax; if (! MemberNameSyntax) MemberNameSyntax = DefaultSyntax; while ((status = I_NsClientBindSearch(&NsiClntBinding, &BindId)) == RPC_S_OK) { RpcTryExcept { nsi_profile_elt_inq_begin(NsiClntBinding, ProfileNameSyntax, ProfileName, InquiryType, (NSI_IF_ID_P_T) IfId, VersOption, MemberNameSyntax, MemberName, InquiryContext, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept status = NsiMapStatus(NsiStatus); if (NsiStatus != NSI_S_NAME_SERVICE_UNAVAILABLE) break; I_NsBindingFoundBogus(&NsiClntBinding, BindId); } I_NsClientBindDone(&NsiClntBinding, BindId); return(status); } RPC_STATUS RPC_ENTRY RpcNsProfileEltInqNextW( IN RPC_NS_HANDLE InquiryContext, OUT RPC_IF_ID * IfId, OUT unsigned short __RPC_FAR * __RPC_FAR * MemberName, OUT unsigned long __RPC_FAR * Priority, OUT unsigned short __RPC_FAR * __RPC_FAR * Annotation ) /*++ Routine Description: Gets the next element in the profile entry. Arguments: InquiryContext - context handle from RpcNsEntryObjectInqBeginW MemberName - place to put profile element name IfId - place to return interface Priority - place to put profile element priority Annotation - place to put profile element comment Returns: nsi_profile_elt_inq_next() --*/ { unsigned short * pAnnotation; unsigned short * pMemberName; unsigned short ** ppAnnotation; unsigned short ** ppMemberName; UNSIGNED16 NsiStatus; if (Annotation) ppAnnotation = Annotation; else ppAnnotation = &pAnnotation; *ppAnnotation = NULL; if (MemberName) ppMemberName = MemberName; else ppMemberName = &pMemberName; *ppMemberName = NULL; RpcTryExcept { nsi_profile_elt_inq_next(InquiryContext, (NSI_IF_ID_P_T) IfId, ppMemberName, Priority, ppAnnotation, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept if (!Annotation) RpcStringFreeW(ppAnnotation); if (!MemberName) RpcStringFreeW(ppMemberName); return(NsiMapStatus(NsiStatus)); } RPC_STATUS RPC_ENTRY RpcNsProfileEltInqDone( OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: Finish enumerating the objects of a profile entry. Arguments: InquiryContext - context handle from RpcNsProfileEltInqBeginW Returns: nsi_profile_elt_inq_done() --*/ { UNSIGNED16 NsiStatus; RpcTryExcept { nsi_profile_elt_inq_done(InquiryContext, &NsiStatus); } RpcExcept(1) { NsiStatus = MapException(RpcExceptionCode()); } RpcEndExcept return(NsiMapStatus(NsiStatus)); } // The following are ASCII wrappers to the UNICODE API's RPC_STATUS RPC_ENTRY RpcNsGroupDeleteA( IN unsigned long GroupNameSyntax, IN unsigned char __RPC_FAR * GroupName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING GroupNameW(GroupName); if (GroupNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsGroupDeleteW(GroupNameSyntax, &GroupNameW)); } RPC_STATUS RPC_ENTRY RpcNsGroupMbrAddA( IN unsigned long GroupNameSyntax, IN unsigned char __RPC_FAR * GroupName, IN unsigned long MemberNameSyntax, IN unsigned char __RPC_FAR * MemberName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING GroupNameW(GroupName); WIDE_STRING MemberNameW(MemberName); if (GroupNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); if (MemberNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsGroupMbrAddW(GroupNameSyntax, &GroupNameW, MemberNameSyntax, &MemberNameW)); } RPC_STATUS RPC_ENTRY RpcNsGroupMbrRemoveA( IN unsigned long GroupNameSyntax, IN unsigned char __RPC_FAR * GroupName, IN unsigned long MemberNameSyntax, IN unsigned char __RPC_FAR * MemberName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING GroupNameW(GroupName); WIDE_STRING MemberNameW(MemberName); if (GroupNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); if (MemberNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsGroupMbrRemoveW(GroupNameSyntax, &GroupNameW, MemberNameSyntax, &MemberNameW)); } RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqBeginA( IN unsigned long GroupNameSyntax, IN unsigned char __RPC_FAR * GroupName, IN unsigned long MemberNameSyntax, OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING GroupNameW(GroupName); if (GroupNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsGroupMbrInqBeginW(GroupNameSyntax, &GroupNameW, MemberNameSyntax, InquiryContext)); } RPC_STATUS RPC_ENTRY RpcNsGroupMbrInqNextA( OUT RPC_NS_HANDLE InquiryContext, OUT unsigned char __RPC_FAR * __RPC_FAR * MemberName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { RPC_STATUS Status; Status = RpcNsGroupMbrInqNextW(InquiryContext, (unsigned short __RPC_FAR * __RPC_FAR *) MemberName); if (Status) return(Status); return(UnicodeToAscii((unsigned short *) *MemberName)); } RPC_STATUS RPC_ENTRY RpcNsEntryObjectInqBeginA( IN unsigned long EntryNameSyntax, IN unsigned char __RPC_FAR * EntryName, OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING EntryNameW(EntryName); if (EntryNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsEntryObjectInqBeginW(EntryNameSyntax, &EntryNameW, InquiryContext)); } RPC_STATUS RPC_ENTRY RpcNsEntryExpandNameA( IN unsigned long EntryNameSyntax, IN unsigned char __RPC_FAR * EntryName, OUT unsigned char __RPC_FAR * __RPC_FAR * ExpandedName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { RPC_STATUS Status; WIDE_STRING EntryNameW(EntryName); if (EntryNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); Status = RpcNsEntryExpandNameW(EntryNameSyntax, &EntryNameW, (unsigned short __RPC_FAR * __RPC_FAR *) ExpandedName); if (Status) return(Status); return(UnicodeToAscii((unsigned short *) *ExpandedName)); } RPC_STATUS RPC_ENTRY RpcNsMgmtBindingUnexportA( IN unsigned long EntryNameSyntax, IN unsigned char * EntryName, IN RPC_IF_ID * IfId, IN unsigned long VersOption, IN UUID_VECTOR * ObjectUuidVec OPTIONAL ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING EntryNameW(EntryName); if (EntryNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsMgmtBindingUnexportW(EntryNameSyntax, &EntryNameW, IfId, VersOption, ObjectUuidVec)); } RPC_STATUS RPC_ENTRY RpcNsMgmtEntryCreateA( IN unsigned long EntryNameSyntax, IN unsigned char * EntryName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING EntryNameW(EntryName); if (EntryNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsMgmtEntryCreateW(EntryNameSyntax, &EntryNameW)); } RPC_STATUS RPC_ENTRY RpcNsMgmtEntryDeleteA( IN unsigned long EntryNameSyntax, IN unsigned char * EntryName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING EntryNameW(EntryName); if (EntryNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsMgmtEntryDeleteW(EntryNameSyntax, &EntryNameW)); } RPC_STATUS RPC_ENTRY RpcNsMgmtEntryInqIfIdsA( IN unsigned long EntryNameSyntax, IN unsigned char * EntryName, OUT RPC_IF_ID_VECTOR ** IfIdVec ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING EntryNameW(EntryName); if (EntryNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsMgmtEntryInqIfIdsW(EntryNameSyntax, &EntryNameW, IfIdVec)); } RPC_STATUS RPC_ENTRY RpcNsProfileDeleteA( IN unsigned long ProfileNameSyntax, IN unsigned char __RPC_FAR * ProfileName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING ProfileNameW(ProfileName); if (ProfileNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsProfileDeleteW(ProfileNameSyntax, &ProfileNameW)); } RPC_STATUS RPC_ENTRY RpcNsProfileEltAddA( IN unsigned long ProfileNameSyntax, IN unsigned char __RPC_FAR * ProfileName, IN RPC_IF_ID * IfId, IN unsigned long MemberNameSyntax, IN unsigned char __RPC_FAR * MemberName, IN unsigned long Priority, IN unsigned char __RPC_FAR * Annotation ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING ProfileNameW(ProfileName); WIDE_STRING MemberNameW(MemberName); WIDE_STRING AnnotationW(Annotation); if (ProfileNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); if (MemberNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); if (AnnotationW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsProfileEltAddW(ProfileNameSyntax, &ProfileNameW, IfId, MemberNameSyntax, &MemberNameW, Priority, &AnnotationW)); } RPC_STATUS RPC_ENTRY RpcNsProfileEltRemoveA( IN unsigned long ProfileNameSyntax, IN unsigned char __RPC_FAR * ProfileName, IN RPC_IF_ID * IfId, IN unsigned long MemberNameSyntax, IN unsigned char __RPC_FAR * MemberName ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING ProfileNameW(ProfileName); WIDE_STRING MemberNameW(MemberName); if (ProfileNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); if (MemberNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsProfileEltRemoveW(ProfileNameSyntax, &ProfileNameW, IfId, MemberNameSyntax, &MemberNameW)); } RPC_STATUS RPC_ENTRY RpcNsProfileEltInqBeginA( IN unsigned long ProfileNameSyntax, IN unsigned char __RPC_FAR * ProfileName, IN unsigned long InquiryType, IN RPC_IF_ID * IfId, IN unsigned long VersOption, IN unsigned long MemberNameSyntax, IN unsigned char __RPC_FAR * MemberName, OUT RPC_NS_HANDLE *InquiryContext ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { WIDE_STRING ProfileNameW(ProfileName); WIDE_STRING MemberNameW(MemberName); if (ProfileNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); if (MemberNameW.OutOfMemory()) return(RPC_S_OUT_OF_MEMORY); return(RpcNsProfileEltInqBeginW(ProfileNameSyntax, &ProfileNameW, InquiryType, IfId, VersOption, MemberNameSyntax, &MemberNameW, InquiryContext)); } RPC_STATUS RPC_ENTRY RpcNsProfileEltInqNextA( IN RPC_NS_HANDLE InquiryContext, OUT RPC_IF_ID * IfId, OUT unsigned char __RPC_FAR * __RPC_FAR * MemberName, OUT unsigned long __RPC_FAR * Priority, OUT unsigned char __RPC_FAR * __RPC_FAR * Annotation ) /*++ Routine Description: This is an ASCII wrapper to the UNICODE version of the API. It converts all char * -> short * strings and calls the UNICODE version. --*/ { RPC_STATUS Status; Status = RpcNsProfileEltInqNextW(InquiryContext, IfId, (unsigned short __RPC_FAR * __RPC_FAR *) MemberName, Priority, (unsigned short __RPC_FAR * __RPC_FAR *) Annotation); if (Status) return(Status); if (Status = UnicodeToAscii((unsigned short *) *MemberName)) return(Status); if (Annotation) return(UnicodeToAscii((unsigned short *) *Annotation)); return Status; }