diff options
Diffstat (limited to 'private/net/svcdlls/rpl/client/rplstub.c')
-rw-r--r-- | private/net/svcdlls/rpl/client/rplstub.c | 1279 |
1 files changed, 1279 insertions, 0 deletions
diff --git a/private/net/svcdlls/rpl/client/rplstub.c b/private/net/svcdlls/rpl/client/rplstub.c new file mode 100644 index 000000000..89d91f3de --- /dev/null +++ b/private/net/svcdlls/rpl/client/rplstub.c @@ -0,0 +1,1279 @@ +/*++ + +Copyright (c) 1993 Microsoft Corporation + +Module Name: + + rplstub.c + +Abstract: + + These are the Remote (Initial) Program Load Service API RPC client stubs. + +Author: + + Vladimir Z. Vulovic (vladimv) 27 - July - 1993 + +Environment: + + User Mode - Win32 + +Revision History: + + 27-Jul-1993 vladimv + Created + +--*/ + +// +// INCLUDES +// + +#include <nt.h> // DbgPrint prototype +#include <ntrtl.h> // DbgPrint prototype +#include <nturtl.h> // Needed by winbase.h + +#include <windef.h> // DWORD +#include <winbase.h> // EXCEPTION_STATUS_VIOLATION + +#include <rpc.h> // DataTypes and runtime APIs +#include <rpcutil.h> // NetRpc utils + +#include <lmsvc.h> +#include <lmcons.h> // NET_API_STATUS +#include <lmerr.h> // NetError codes + +#include <netlib.h> // NetpServiceIsStarted() (needed by netrpc.h). +#include <netdebug.h> // needed for netrpc.h +#include <netrpc.h> // NET_REMOTE macros. + +#include <rplsvc_c.h> // generated by the MIDL complier + +DWORD RplMapRpcError( + IN DWORD RpcError, + IN DWORD BadContextError + ); + + + +NET_API_STATUS NET_API_FUNCTION +NetRplOpen( + IN LPTSTR ServerName, + OUT LPRPL_HANDLE ServerHandle + ) +/*++ + +Routine Description: + + +Arguments: + + +Return Value: + + +--*/ +{ + NET_API_STATUS status = ERROR_SUCCESS; + + RpcTryExcept { + *ServerHandle = NULL; // needed for RPC to create new context handle + status = NetrRplOpen( ServerName, (LPRPL_RPC_HANDLE)ServerHandle); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + if (status != NO_ERROR){ + ServerHandle = NULL; + } + + return( status); +} + + + +NET_API_STATUS NET_API_FUNCTION +NetRplClose( + IN RPL_HANDLE ServerHandle + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplClose( (LPRPL_RPC_HANDLE)&ServerHandle); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + + +NET_API_STATUS NET_API_FUNCTION +NetRplGetInfo( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer + ) +/*++ + +Routine Description: + + This is the DLL entrypoint for NetRplGetInfo. + +Arguments: + + ServerHandle - Handle obtained through NetRplOpen(). + + InfoLevel - This indicates the level of information that is desired. + + PointerToBuffer - Pointer to a Location where the pointer to the returned + information structure is to be placed. + +Return Value: + + NET_API_STATUS - NERR_Success or reason for failure. + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + *PointerToBuffer = NULL; // Must be NULL so RPC knows to fill it in. + status = NetrRplGetInfo( + (RPL_RPC_HANDLE)ServerHandle, + InfoLevel, + (LPRPL_INFO_STRUCT)PointerToBuffer + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplSetInfo( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +/*++ + +Routine Description: + + This is the DLL entrypoint for NetRplSetInfo. + +Arguments: + + ServerHandle - Handle obtained through NetRplOpen(). + + InfoLevel - This indicates the level of information that is desired. + + Buffer - Pointer to the information structure to be set. InfoLevel describes + the structure in this buffer. + + ErrorParameter - - Returns the identifier to the invalid parameter in Buffer if this + function returns ERROR_INVALID_PARAMETER. + +Return Value: + + NET_API_STATUS - NERR_Success or reason for failure. + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplSetInfo( + (RPL_RPC_HANDLE)ServerHandle, + InfoLevel, + (LPRPL_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +// +// BOOT block apis +// + + +NET_API_STATUS NET_API_FUNCTION +NetRplBootAdd( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplBootAdd( + (RPL_RPC_HANDLE)ServerHandle, + InfoLevel, + (LPRPL_BOOT_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + +// +// NetRplBootDel: if VendorName is NULL, then all boot block records with +// given BootName will be deleted. +// + +NET_API_STATUS NET_API_FUNCTION +NetRplBootDel( + IN RPL_HANDLE ServerHandle, + IN LPTSTR BootName, + IN LPTSTR VendorName + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplBootDel( + (RPL_RPC_HANDLE)ServerHandle, + BootName, + VendorName + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplBootEnum( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer, + IN DWORD PrefMaxLength, + OUT LPDWORD EntriesRead, + OUT LPDWORD TotalEntries, + OUT LPDWORD ResumeHandle + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + GENERIC_ENUM_STRUCT InfoStruct; + GENERIC_INFO_CONTAINER GenericInfoContainer; + + GenericInfoContainer.Buffer = NULL; + GenericInfoContainer.EntriesRead = 0; + + InfoStruct.Container = &GenericInfoContainer; + InfoStruct.Level = InfoLevel; + + RpcTryExcept { + status = NetrRplBootEnum( + (RPL_RPC_HANDLE)ServerHandle, + (LPRPL_BOOT_ENUM)&InfoStruct, + PrefMaxLength, + TotalEntries, + ResumeHandle + ); + if ( status == NERR_Success || status == ERROR_MORE_DATA) { + *PointerToBuffer = (LPBYTE)GenericInfoContainer.Buffer; + *EntriesRead = GenericInfoContainer.EntriesRead; + } + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + +// +// CONFIG apis +// + + +NET_API_STATUS NET_API_FUNCTION +NetRplConfigAdd( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplConfigAdd( + (RPL_RPC_HANDLE)ServerHandle, + InfoLevel, + (LPRPL_CONFIG_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplConfigDel( + IN RPL_HANDLE ServerHandle, + IN LPTSTR ConfigName + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplConfigDel( + (RPL_RPC_HANDLE)ServerHandle, + ConfigName + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplConfigEnum( + IN RPL_HANDLE ServerHandle, + IN LPTSTR AdapterName, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer, + IN DWORD PrefMaxLength, + OUT LPDWORD EntriesRead, + OUT LPDWORD TotalEntries, + OUT LPDWORD ResumeHandle + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + GENERIC_ENUM_STRUCT InfoStruct; + GENERIC_INFO_CONTAINER GenericInfoContainer; + + GenericInfoContainer.Buffer = NULL; + GenericInfoContainer.EntriesRead = 0; + + InfoStruct.Container = &GenericInfoContainer; + InfoStruct.Level = InfoLevel; + + RpcTryExcept { + status = NetrRplConfigEnum( + (RPL_RPC_HANDLE)ServerHandle, + AdapterName, + (LPRPL_CONFIG_ENUM)&InfoStruct, + PrefMaxLength, + TotalEntries, + ResumeHandle + ); + if ( status == NERR_Success || status == ERROR_MORE_DATA) { + *PointerToBuffer = (LPBYTE)GenericInfoContainer.Buffer; + *EntriesRead = GenericInfoContainer.EntriesRead; + } + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +// +// PROFILE apis +// + + +NET_API_STATUS NET_API_FUNCTION +NetRplProfileAdd( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplProfileAdd( + (RPL_RPC_HANDLE)ServerHandle, + InfoLevel, + (LPRPL_PROFILE_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplProfileClone( + IN RPL_HANDLE ServerHandle, + IN LPTSTR SourceProfileName, + IN LPTSTR TargetProfileName, + IN LPTSTR TargetProfileComment OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplProfileClone( + (RPL_RPC_HANDLE)ServerHandle, + SourceProfileName, + TargetProfileName, + TargetProfileComment + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + + +NET_API_STATUS NET_API_FUNCTION +NetRplProfileDel( + IN RPL_HANDLE ServerHandle, + IN LPTSTR ProfileName + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplProfileDel( + (RPL_RPC_HANDLE)ServerHandle, + ProfileName + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplProfileEnum( + IN RPL_HANDLE ServerHandle, + IN LPTSTR AdapterName, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer, + IN DWORD PrefMaxLength, + OUT LPDWORD EntriesRead, + OUT LPDWORD TotalEntries, + OUT LPDWORD ResumeHandle + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + GENERIC_ENUM_STRUCT InfoStruct; + GENERIC_INFO_CONTAINER GenericInfoContainer; + + GenericInfoContainer.Buffer = NULL; + GenericInfoContainer.EntriesRead = 0; + + InfoStruct.Container = &GenericInfoContainer; + InfoStruct.Level = InfoLevel; + + RpcTryExcept { + status = NetrRplProfileEnum( + (RPL_RPC_HANDLE)ServerHandle, + AdapterName, + (LPRPL_PROFILE_ENUM)&InfoStruct, + PrefMaxLength, + TotalEntries, + ResumeHandle + ); + if ( status == NERR_Success || status == ERROR_MORE_DATA) { + *PointerToBuffer = (LPBYTE)GenericInfoContainer.Buffer; + *EntriesRead = GenericInfoContainer.EntriesRead; + } + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplProfileGetInfo( + IN RPL_HANDLE ServerHandle, + IN LPTSTR ProfileName, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + *PointerToBuffer = NULL; // Must be NULL so RPC knows to fill it in. + status = NetrRplProfileGetInfo( + (RPL_RPC_HANDLE)ServerHandle, + ProfileName, + InfoLevel, + (LPRPL_PROFILE_INFO_STRUCT)PointerToBuffer + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplProfileSetInfo( + IN RPL_HANDLE ServerHandle, + IN LPTSTR ProfileName, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplProfileSetInfo( + (RPL_RPC_HANDLE)ServerHandle, + ProfileName, + InfoLevel, + (LPRPL_PROFILE_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + +// +// VENDOR apis +// + + +NET_API_STATUS NET_API_FUNCTION +NetRplVendorAdd( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplVendorAdd( + (RPL_RPC_HANDLE)ServerHandle, + InfoLevel, + (LPRPL_VENDOR_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplVendorDel( + IN RPL_HANDLE ServerHandle, + IN LPTSTR VendorName + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplVendorDel( + (RPL_RPC_HANDLE)ServerHandle, + VendorName + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplVendorEnum( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer, + IN DWORD PrefMaxLength, + OUT LPDWORD EntriesRead, + OUT LPDWORD TotalEntries, + OUT LPDWORD ResumeHandle + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + GENERIC_ENUM_STRUCT InfoStruct; + GENERIC_INFO_CONTAINER GenericInfoContainer; + + GenericInfoContainer.Buffer = NULL; + GenericInfoContainer.EntriesRead = 0; + + InfoStruct.Container = &GenericInfoContainer; + InfoStruct.Level = InfoLevel; + + RpcTryExcept { + status = NetrRplVendorEnum( + (RPL_RPC_HANDLE)ServerHandle, + (LPRPL_VENDOR_ENUM)&InfoStruct, + PrefMaxLength, + TotalEntries, + ResumeHandle + ); + if ( status == NERR_Success || status == ERROR_MORE_DATA) { + *PointerToBuffer = (LPBYTE)GenericInfoContainer.Buffer; + *EntriesRead = GenericInfoContainer.EntriesRead; + } + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + +// +// ADAPTER apis +// + + +NET_API_STATUS NET_API_FUNCTION +NetRplAdapterAdd( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplAdapterAdd( + (RPL_RPC_HANDLE)ServerHandle, + InfoLevel, + (LPRPL_ADAPTER_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplAdapterDel( + IN RPL_HANDLE ServerHandle, + IN LPTSTR AdapterName OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplAdapterDel( + (RPL_RPC_HANDLE)ServerHandle, + AdapterName + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplAdapterEnum( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer, + IN DWORD PrefMaxLength, + OUT LPDWORD EntriesRead, + OUT LPDWORD TotalEntries, + OUT LPDWORD ResumeHandle + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + GENERIC_ENUM_STRUCT InfoStruct; + GENERIC_INFO_CONTAINER GenericInfoContainer; + + GenericInfoContainer.Buffer = NULL; + GenericInfoContainer.EntriesRead = 0; + + InfoStruct.Container = &GenericInfoContainer; + InfoStruct.Level = InfoLevel; + + RpcTryExcept { + status = NetrRplAdapterEnum( + (RPL_RPC_HANDLE)ServerHandle, + (LPRPL_ADAPTER_ENUM)&InfoStruct, + PrefMaxLength, + TotalEntries, + ResumeHandle + ); + if ( status == NERR_Success || status == ERROR_MORE_DATA) { + *PointerToBuffer = (LPBYTE)GenericInfoContainer.Buffer; + *EntriesRead = GenericInfoContainer.EntriesRead; + } + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +// +// WKSTA apis +// + + +NET_API_STATUS NET_API_FUNCTION +NetRplWkstaAdd( + IN RPL_HANDLE ServerHandle, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplWkstaAdd( + (RPL_RPC_HANDLE)ServerHandle, + InfoLevel, + (LPRPL_WKSTA_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplWkstaClone( + IN RPL_HANDLE ServerHandle, + IN LPTSTR SourceWkstaName, + IN LPTSTR TargetWkstaName, + IN LPTSTR TargetWkstaComment OPTIONAL, + IN LPTSTR TargetAdapterName, + IN DWORD TargetWkstaIpAddress + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplWkstaClone( + (RPL_RPC_HANDLE)ServerHandle, + SourceWkstaName, + TargetWkstaName, + TargetWkstaComment, + TargetAdapterName, + TargetWkstaIpAddress + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplWkstaDel( + IN RPL_HANDLE ServerHandle, + IN LPTSTR WkstaName + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplWkstaDel( + (RPL_RPC_HANDLE)ServerHandle, + WkstaName + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplWkstaEnum( + IN RPL_HANDLE ServerHandle, + IN LPTSTR ProfileName, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer, + IN DWORD PrefMaxLength, + OUT LPDWORD EntriesRead, + OUT LPDWORD TotalEntries, + OUT LPDWORD ResumeHandle + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + GENERIC_ENUM_STRUCT InfoStruct; + GENERIC_INFO_CONTAINER GenericInfoContainer; + + GenericInfoContainer.Buffer = NULL; + GenericInfoContainer.EntriesRead = 0; + + InfoStruct.Container = &GenericInfoContainer; + InfoStruct.Level = InfoLevel; + + RpcTryExcept { + status = NetrRplWkstaEnum( + (RPL_RPC_HANDLE)ServerHandle, + ProfileName, + (LPRPL_WKSTA_ENUM)&InfoStruct, + PrefMaxLength, + TotalEntries, + ResumeHandle + ); + if ( status == NERR_Success || status == ERROR_MORE_DATA) { + *PointerToBuffer = (LPBYTE)GenericInfoContainer.Buffer; + *EntriesRead = GenericInfoContainer.EntriesRead; + } + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplWkstaGetInfo( + IN RPL_HANDLE ServerHandle, + IN LPTSTR WkstaName, + IN DWORD InfoLevel, + OUT LPBYTE * PointerToBuffer + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + *PointerToBuffer = NULL; // Must be NULL so RPC knows to fill it in. + status = NetrRplWkstaGetInfo( + (RPL_RPC_HANDLE)ServerHandle, + WkstaName, + InfoLevel, + (LPRPL_WKSTA_INFO_STRUCT)PointerToBuffer + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplWkstaSetInfo( + IN RPL_HANDLE ServerHandle, + IN LPTSTR WkstaName, + IN DWORD InfoLevel, + IN LPBYTE Buffer, + OUT LPDWORD ErrorParameter OPTIONAL + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplWkstaSetInfo( + (RPL_RPC_HANDLE)ServerHandle, + WkstaName, + InfoLevel, + (LPRPL_WKSTA_INFO_STRUCT)&Buffer, + ErrorParameter + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +NET_API_STATUS NET_API_FUNCTION +NetRplSetSecurity( + IN RPL_HANDLE ServerHandle, + IN LPTSTR WkstaName OPTIONAL, + IN DWORD WkstaRid, + IN DWORD RplUserRid + ) +/*++ + +Routine Description: + +Arguments: + +Return Value: + +--*/ +{ + NET_API_STATUS status; + + RpcTryExcept { + status = NetrRplSetSecurity( + (RPL_RPC_HANDLE)ServerHandle, + WkstaName, + WkstaRid, + RplUserRid + ); + } + RpcExcept( EXCEPTION_EXECUTE_HANDLER) { + status = RplMapRpcError( RpcExceptionCode(), ERROR_INVALID_HANDLE); + } + RpcEndExcept + + return( status); +} + + +DWORD RplMapRpcError( + IN DWORD RpcError, + IN DWORD BadContextError + ) +/*++ + +Routine Description: + + This routine maps the RPC error into a more meaningful error + for the caller. + +Arguments: + + RpcError - Supplies the exception error raised by RPC + + BadContextError - Supplies the error code to return whenever an error + which indicates invalid context is received. In some cases, this + value is ERROR_INVALID_HANDLE in others, it is ERROR_INVALID_SERVICE_LOCK. + +Return Value: + + Returns the mapped error. + +--*/ +{ + switch ( RpcError) { + + case RPC_S_INVALID_BINDING: + case RPC_X_SS_IN_NULL_CONTEXT: + case RPC_X_SS_CONTEXT_DAMAGED: + case RPC_X_SS_HANDLES_MISMATCH: + case ERROR_INVALID_HANDLE: + return( BadContextError); + + case RPC_X_NULL_REF_POINTER: + return( ERROR_INVALID_PARAMETER); + + case EXCEPTION_ACCESS_VIOLATION: + return( ERROR_INVALID_ADDRESS); + + default: + return( RpcError); + } +} + |