/*++ Copyright (c) 1995 Microsoft Corporation Module Name: NdsLib32.h Abstract: This module exposes the minimal win32 API to Netware directory services support in the Netware redirector. Author: Cory West [CoryWest] 23-Feb-1995 --*/ #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif NTSTATUS NwNdsOpenTreeHandle( IN PUNICODE_STRING puNdsTree, OUT PHANDLE phNwRdrHandle ); // NwNdsOpenTreeHandle( PUNICODE_STRING, PHANDLE ) // // Given an NDS tree name, this opens a handle the the redirector // for accessing that tree. The handle should closed using the // standard NT CloseHandle() call. This function is only a // simple wrapper around NT OpenFile(). // // Administrativa. // #define HANDLE_TYPE_NCP_SERVER 1 #define HANDLE_TYPE_NDS_TREE 2 NTSTATUS NwNdsOpenGenericHandle( IN PUNICODE_STRING puNdsTree, OUT LPDWORD lpdwHandleType, OUT PHANDLE phNwRdrHandle ); // NwNdsOpenGenericHandle( PUNICODE_STRING, LPDWORD, PHANDLE ) // // Given a name, this opens a handle the the redirector for accessing that // named tree or server. lpdwHandleType is set to either HANDLE_TYPE_NCP_SERVER // or HANDLE_TYPE_NDS_TREE accordingly. The handle should be closed using // the standard NT CloseHandle() call. This function is only a simple // wrapper around NT OpenFile(). NTSTATUS NwOpenHandleWithSupplementalCredentials( IN PUNICODE_STRING puResourceName, IN PUNICODE_STRING puUserName, IN PUNICODE_STRING puPassword, OUT LPDWORD lpdwHandleType, OUT PHANDLE phNwHandle ); // NwOpenHandleWithSupplementalCredentials // // Given a resource name (either a server name or a tree name), // open a handle to that resource with the provided username and // password. As with the open generic handle routine, lpdsHandleType // will be set to either HANDLE_TYPE_NCP_SERVER or // HANDLE_TYPE_NDS_TREE based on the result of the open. // // Administrativa. // NTSTATUS NwNdsSetTreeContext ( IN HANDLE hNdsRdr, IN PUNICODE_STRING puTree, IN PUNICODE_STRING puContext ); // NwNdsSetTreeContext(HANDLE, PUNICODE_STRING, PUNICODE_STRING) // // Set the current context for the specified tree. // // Arguments: // // HANDLE hNdsRdr - A handle to the redirector. // PUNICODE_STRING puTree - The tree name. // PUNICODE_STRING puContext - The context in that tree. NTSTATUS NwNdsGetTreeContext ( IN HANDLE hNdsRdr, IN PUNICODE_STRING puTree, OUT PUNICODE_STRING puContext ); // NwNdsGetTreeContext(HANDLE, PUNICODE_STRING, PUNICODE_STRING) // // Get the current context for the specified tree. // // Arguments: // // HANDLE hNdsRdr - A handle to the redirector. // PUNICODE_STRING puTree - The tree name. // PUNICODE_STRING puContext - The context in that tree. NTSTATUS NwNdsIsNdsConnection ( IN HANDLE hNdsRdr, OUT BOOL * pfIsNds, IN OUT PUNICODE_STRING puTree ); // NwNdsIsNdsConnection(HANDLE, PUNICODE_STRING) // // Get the current context for the specified tree. // // Arguments: // // HANDLE hNdsRdr - A handle to the redirector. // BOOL * - Get the boolean value of connection test // PUNICODE_STRING puTree - The tree name that handle to server // represents. Caller allocates puTree // with a buffer big enough to hold // 48 WCHARs. // // Returns: TRUE if hNdsRdr is a handle connected to a server that // is part of a NDS directory tree. puTree will contain // the tree name. // FALSE: if hNdsRdr is not a NDS tree handle. // // Browsing and Navigating support. // NTSTATUS NwNdsResolveName ( IN HANDLE hNdsTree, IN PUNICODE_STRING puObjectName, OUT DWORD *dwObjectId, OUT PUNICODE_STRING puReferredServer, OUT PBYTE pbRawResponse, IN DWORD dwResponseBufferLen ); // NwNdsResolveName(HANDLE, PUNICODE_STRING, PDWORD) // // Resolve the given name to an NDS object id. This utilizes // NDS verb 1. // // There is currently no interface for canonicalizing names. // This call will use the default context if one has been set // for this NDS tree. // // puReferredServer must point to a UNICODE_STRING with enough // space to hold a server name (MAX_SERVER_NAME_LENGTH) * // sizeof( WCHAR ). // // If dwResponseBufferLen is not 0, and pbRawResponse points // to a writable buffer of length dwResponseBufferLen, then // this routine will also return the entire NDS response in // the raw response buffer. The NDS response is described // by NDS_RESPONSE_RESOLVE_NAME. // // Arguments: // // HANDLE hNdsTree - The name of the NDS tree that we are interested in looking into. // PUNICODE_STRING puObjectName - The name that we want resolved into an object id. // DWORD *dwObjectId - The place where we will place the object id. // BYTE *pbRawResponse - The raw response buffer, if desired. // DWORD dwResponseBufferLen - The length of the raw response buffer. NTSTATUS NwNdsList ( IN HANDLE hNdsTree, IN DWORD dwObjectId, OUT DWORD *dwIterHandle, OUT BYTE *pbReplyBuf, IN DWORD dwReplyBufLen ); // NwNdsList(HANDLE, DWORD, PDWORD, PBYTE, DWORD, PDWORD) // // List the immediate subordinates of an object. This utilizes // NDS verb 5. // // Arguments: // // HANDLE hNdsTree - The handle to the tree that we are interested in. // DWORD dwObjectId - The object that we want to list. // DWORD *dwIterHandle - The iteration handle to be used in continuing // the request if the buffer is not large enough for the entire // list of subordinates. // BYTE *pbReplyBuf - The buffer where the raw reply will be placed. // DWORD dwReplyBufLen - The length of the raw reply buffer. NTSTATUS NwNdsReadObjectInfo( IN HANDLE hNdsTree, IN DWORD dwObjectId, OUT PBYTE pbReplyBuf, IN DWORD dwReplyBufLen ); // NwNdsReadObjectInfo(PUNICODE_STRING, DWORD, PBYTE, DWORD) // // Given an object id, this gets the basic info for the object. This // utilizes NDS verb 2. The reply buffer should be large enough to // hold a DS_OBJ_INFO struct and the text of the two unicode strings. // // Arguments: // // HANDLE hNdsTree - The tree that we want to look in. // DWORD dwObjectId - The object id that we want to learn about. // BYTE *pbReplyBuf - The space for the reply. // DWORD dwReplyBufLen - The length of the reply buffer. NTSTATUS NwNdsReadAttribute ( IN HANDLE hNdsTree, IN DWORD dwObjectId, IN DWORD *dwIterHandle, IN PUNICODE_STRING puAttrName, OUT BYTE *pbReplyBuf, IN DWORD dwReplyBufLen ); // NwNdsReadAttribute(HANDLE, DWORD, PDWORD, PUNICODE_STRING, PBYTE, DWORD) // // Read the requested attribute from the listed object. // This utilizes NDS verb 3. // // Arguments: // // HANDLE hNdsTree - The tree that we want to read from. // DWORD dwObjectId - The object that we want to read from. // DWORD *dwIterHandle - The iteration handle. // PUNICODE_STRING puAttrName - The name of the attribute. // BYTE *pbReplyBuf - The buffer to hold the response. // DWORD deReplyBufLen - The length of the reply buffer. NTSTATUS NwNdsOpenStream ( IN HANDLE hNdsTree, IN DWORD dwObjectId, IN PUNICODE_STRING puStreamName, IN DWORD dwOpenFlags, OUT DWORD *pdwFileLength ); // NwNdsOpenStream(HANDLE, DWORD, PBYTE, DWORD) // // Open a file handle to the stream listed. // This utilizes NDS verb 27. // // Arguments: // // HANDLE hNdsTree - The handle to the NDS tree that we are interested in. // DWORD dwObjectId - The object id that we want to query. // PUNICODE_STRING puStreamName - The name of the stream that we want to open. // DWORD dwOpenFlags - 1 for read, 2 for write, 3 for read/write. // DWORD *pdwFileLength - The length of the file stream. NTSTATUS NwNdsGetQueueInformation( IN HANDLE hNdsTree, IN PUNICODE_STRING puQueueName, OUT PUNICODE_STRING puHostServer, OUT PDWORD pdwQueueId ); // NwNdsGetQueueInformation(HANDLE, PUNICODE_STRING, PUNICODE_STRING, PDWORD) // // Arguments: // // HANDLE hNdsTree - The handle to the NDS tree that knows about the queue. // PUNICODE_STRING puQueueName - The ds path to the queue that we want. // PUNICODE_STRING puHostServer - The host server for this queue. // PDWORD pdwQueueId - The queue id for this queue on this server. NTSTATUS NwNdsGetVolumeInformation( IN HANDLE hNdsTree, IN PUNICODE_STRING puVolumeName, OUT PUNICODE_STRING puHostServer, OUT PUNICODE_STRING puHostVolume ); // NwNdsGetVoluemInformation(HANDLE, PUNICODE_STRING, PUNICODE_STRING, PUNICODE_STRING) // // Arguments: // // HANDLE hNdsTree - The handle to the NDS tree that knows about the volume. // PUNICODE_STRING puVolumeName - The ds path to the volume that we want. // PUNICODE_STRING puHostServer - The host server for this nds volume. // PUNICODE_STRING puHostVolume - The host volume for this nds volume. // // User mode fragment exchange. // NTSTATUS _cdecl FragExWithWait( IN HANDLE hNdsServer, IN DWORD NdsVerb, IN BYTE *pReplyBuffer, IN DWORD pReplyBufferLen, IN OUT DWORD *pdwReplyLen, IN BYTE *NdsRequestStr, ... ); NTSTATUS _cdecl ParseResponse( PUCHAR Response, ULONG ResponseLength, char* FormatString, ... ); int _cdecl FormatBuf( char *buf, int bufLen, const char *format, va_list args ); // // Change password support. // NTSTATUS NwNdsChangePassword( IN HANDLE hNwRdr, IN PUNICODE_STRING puTreeName, IN PUNICODE_STRING puUserName, IN PUNICODE_STRING puCurrentPassword, IN PUNICODE_STRING puNewPassword ); #ifdef __cplusplus } // extern "C" #endif