From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/nw/svcdlls/nwwks/inc/imports.h | 15 +++ private/nw/svcdlls/nwwks/inc/nwauth.h | 70 ++++++++++ private/nw/svcdlls/nwwks/inc/nwlsa.h | 69 ++++++++++ private/nw/svcdlls/nwwks/inc/nwmisc.h | 160 +++++++++++++++++++++++ private/nw/svcdlls/nwwks/inc/nwreg.h | 85 +++++++++++++ private/nw/svcdlls/nwwks/inc/rnrdefs.h | 226 +++++++++++++++++++++++++++++++++ private/nw/svcdlls/nwwks/inc/sapcmn.h | 66 ++++++++++ private/nw/svcdlls/nwwks/inc/splutil.h | 81 ++++++++++++ 8 files changed, 772 insertions(+) create mode 100644 private/nw/svcdlls/nwwks/inc/imports.h create mode 100644 private/nw/svcdlls/nwwks/inc/nwauth.h create mode 100644 private/nw/svcdlls/nwwks/inc/nwlsa.h create mode 100644 private/nw/svcdlls/nwwks/inc/nwmisc.h create mode 100644 private/nw/svcdlls/nwwks/inc/nwreg.h create mode 100644 private/nw/svcdlls/nwwks/inc/rnrdefs.h create mode 100644 private/nw/svcdlls/nwwks/inc/sapcmn.h create mode 100644 private/nw/svcdlls/nwwks/inc/splutil.h (limited to 'private/nw/svcdlls/nwwks/inc') diff --git a/private/nw/svcdlls/nwwks/inc/imports.h b/private/nw/svcdlls/nwwks/inc/imports.h new file mode 100644 index 000000000..93176c732 --- /dev/null +++ b/private/nw/svcdlls/nwwks/inc/imports.h @@ -0,0 +1,15 @@ +#include + +#ifdef MIDL_PASS +#define LPWSTR [string] wchar_t* +#define PSECURITY_DESCRIPTOR DWORD +#endif + +#include +#include +#include +#include +#define _INC_WINDOWS +#include +#include +#include diff --git a/private/nw/svcdlls/nwwks/inc/nwauth.h b/private/nw/svcdlls/nwwks/inc/nwauth.h new file mode 100644 index 000000000..72f78e3a8 --- /dev/null +++ b/private/nw/svcdlls/nwwks/inc/nwauth.h @@ -0,0 +1,70 @@ +/*++ + +Copyright (c) 1994 Microsoft Corporation + +Module Name: + + nwauth.h + +Abstract: + + Header for data structures provided by the NetWare + authentication package. + +Author: + + Rita Wong (ritaw) 4-Feb-1994 + +Revision History: + +--*/ + +#ifndef _NWAUTH_INCLUDED_ +#define _NWAUTH_INCLUDED_ + +#include + +// +// Name of the authentication package. +// +#define NW_AUTH_PACKAGE_NAME "NETWARE_AUTHENTICATION_PACKAGE_V1_0" + +// +// LsaCallAuthenticationPackage() submission and response +// message types. +// + +typedef enum _NWAUTH_MESSAGE_TYPE { + NwAuth_GetCredential = 0, + NwAuth_SetCredential +} NWAUTH_MESSAGE_TYPE, *PNWAUTH_MESSAGE_TYPE; + +// +// NwAuth_GetCredential submit buffer and response +// +typedef struct _NWAUTH_GET_CREDENTIAL_REQUEST { + NWAUTH_MESSAGE_TYPE MessageType; + LUID LogonId; +} NWAUTH_GET_CREDENTIAL_REQUEST, *PNWAUTH_GET_CREDENTIAL_REQUEST; + +typedef struct _NWAUTH_GET_CREDENTIAL_RESPONSE { + WCHAR UserName[NW_MAX_USERNAME_LEN + 1]; + WCHAR Password[NW_MAX_PASSWORD_LEN + 1]; +} NWAUTH_GET_CREDENTIAL_RESPONSE, *PNWAUTH_GET_CREDENTIAL_RESPONSE; + + +// +// NwAuth_SetCredential submit buffer +// +typedef struct _NWAUTH_SET_CREDENTIAL_REQUEST { + NWAUTH_MESSAGE_TYPE MessageType; + LUID LogonId; + WCHAR UserName[NW_MAX_USERNAME_LEN + 1]; + WCHAR Password[NW_MAX_PASSWORD_LEN + 1]; +} NWAUTH_SET_CREDENTIAL_REQUEST, *PNWAUTH_SET_CREDENTIAL_REQUEST; + +#define NW_ENCODE_SEED 0x5C +#define NW_ENCODE_SEED2 0xA9 +#define NW_ENCODE_SEED3 0x83 + +#endif // _NWAUTH_INCLUDED_ diff --git a/private/nw/svcdlls/nwwks/inc/nwlsa.h b/private/nw/svcdlls/nwwks/inc/nwlsa.h new file mode 100644 index 000000000..cb2245c5d --- /dev/null +++ b/private/nw/svcdlls/nwwks/inc/nwlsa.h @@ -0,0 +1,69 @@ +/*++ + +Copyright (c) 1993 Microsoft Corporation + +Module Name: + + nwlsa.h + +Abstract: + + Header for LSA helper routines used by both the client and + server sides of the workstation service. + +Author: + + Rita Wong (ritaw) 22-Mar-1993 + +Revision History: + +--*/ + +#ifndef _NWLSA_INCLUDED_ +#define _NWLSA_INCLUDED_ + +#include + + +DWORD +NwOpenPolicy( + IN ACCESS_MASK DesiredAccess, + OUT LSA_HANDLE *PolicyHandle + ); + +DWORD +NwOpenSecret( + IN ACCESS_MASK DesiredAccess, + IN LSA_HANDLE PolicyHandle, + IN LPWSTR LsaSecretName, + OUT PLSA_HANDLE SecretHandle + ); + +DWORD +NwFormSecretName( + IN LPWSTR UserName, + OUT LPWSTR *LsaSecretName + ); + +DWORD +NwSetPassword( + IN LPWSTR UserName, + IN LPWSTR Password + ); + +DWORD +NwDeletePassword( + IN LPWSTR UserName + ); + +DWORD +NwGetPassword( + IN LPWSTR UserName, + OUT PUNICODE_STRING *Password, + OUT PUNICODE_STRING *OldPassword + ); + +#define LAST_USER L"LastUser" +#define GATEWAY_USER L"GatewayUser" + +#endif // _NWLSA_INCLUDED_ diff --git a/private/nw/svcdlls/nwwks/inc/nwmisc.h b/private/nw/svcdlls/nwwks/inc/nwmisc.h new file mode 100644 index 000000000..8b58de22d --- /dev/null +++ b/private/nw/svcdlls/nwwks/inc/nwmisc.h @@ -0,0 +1,160 @@ +/*++ + +Copyright (c) 1992-1993 Microsoft Corporation + +Module Name: + + nwmisc.h + +Abstract: + + Header which specifies the misc routines used by the workstation service. + +Author: + + Chuck Y Chan (chuckc) 2-Mar-1994 + +Revision History: + + Glenn A Curtis (glennc) 18-Jul-1995 + +--*/ + +#ifndef _NWMISC_INCLUDED_ +#define _NWMISC_INCLUDED_ + +#include +#include +#include +#include "sapcmn.h" + +DWORD +NwGetGraceLoginCount( + LPWSTR Server, + LPWSTR UserName, + LPDWORD lpResult + ); + +// +// Commonly reference value for NCP Server name length +// +#define NW_MAX_SERVER_LEN 48 + + +// +// Flags used for the function NwParseNdsUncPath() +// +#define PARSE_NDS_GET_TREE_NAME 0 +#define PARSE_NDS_GET_PATH_NAME 1 +#define PARSE_NDS_GET_OBJECT_NAME 2 + + +WORD +NwParseNdsUncPath( + IN OUT LPWSTR * Result, + IN LPWSTR ContainerName, + IN ULONG flag + ); + +// +// NDS Object class type identifiers +// +#define CLASS_TYPE_ALIAS 1 +#define CLASS_TYPE_AFP_SERVER 2 +#define CLASS_TYPE_BINDERY_OBJECT 3 +#define CLASS_TYPE_BINDERY_QUEUE 4 +#define CLASS_TYPE_COMPUTER 5 +#define CLASS_TYPE_COUNTRY 6 +#define CLASS_TYPE_DIRECTORY_MAP 7 +#define CLASS_TYPE_GROUP 8 +#define CLASS_TYPE_LOCALITY 9 +#define CLASS_TYPE_NCP_SERVER 10 +#define CLASS_TYPE_ORGANIZATION 11 +#define CLASS_TYPE_ORGANIZATIONAL_ROLE 12 +#define CLASS_TYPE_ORGANIZATIONAL_UNIT 13 +#define CLASS_TYPE_PRINTER 14 +#define CLASS_TYPE_PRINT_SERVER 15 +#define CLASS_TYPE_PROFILE 16 +#define CLASS_TYPE_QUEUE 17 +#define CLASS_TYPE_TOP 18 +#define CLASS_TYPE_UNKNOWN 19 +#define CLASS_TYPE_USER 20 +#define CLASS_TYPE_VOLUME 21 + +#define CLASS_NAME_ALIAS L"Alias" +#define CLASS_NAME_AFP_SERVER L"AFP Server" +#define CLASS_NAME_BINDERY_OBJECT L"Bindery Object" +#define CLASS_NAME_BINDERY_QUEUE L"Bindery Queue" +#define CLASS_NAME_COMPUTER L"Computer" +#define CLASS_NAME_COUNTRY L"Country" +#define CLASS_NAME_DIRECTORY_MAP L"Directory Map" +#define CLASS_NAME_GROUP L"Group" +#define CLASS_NAME_LOCALITY L"Locality" +#define CLASS_NAME_NCP_SERVER L"NCP Server" +#define CLASS_NAME_ORGANIZATION L"Organization" +#define CLASS_NAME_ORGANIZATIONAL_ROLE L"Organizational Role" +#define CLASS_NAME_ORGANIZATIONAL_UNIT L"Organizational Unit" +#define CLASS_NAME_PRINTER L"Printer" +#define CLASS_NAME_PRINT_SERVER L"Print Server" +#define CLASS_NAME_PROFILE L"Profile" +#define CLASS_NAME_QUEUE L"Queue" +#define CLASS_NAME_TOP L"Top" +#define CLASS_NAME_UNKNOWN L"Unknown" +#define CLASS_NAME_USER L"User" +#define CLASS_NAME_VOLUME L"Volume" + + +// +// Node structure in the registered service link list and +// functions to add/remove items from the link list +// + +typedef struct _REGISTERED_SERVICE { + WORD nSapType; // SAP Type + BOOL fAdvertiseBySap; // TRUE if advertise by SAP agent + LPSERVICE_INFO pServiceInfo; // Info about this service + struct _REGISTERED_SERVICE *Next; // Points to the next service node +} REGISTERED_SERVICE, *PREGISTERED_SERVICE; + + +PREGISTERED_SERVICE +GetServiceItemFromList( + IN WORD nSapType, + IN LPWSTR pServiceName +); + +DWORD +NwRegisterService( + IN LPSERVICE_INFO lpServiceInfo, + IN WORD nSapType, + IN HANDLE hEventHandle +); + +DWORD +NwDeregisterService( + IN LPSERVICE_INFO lpServiceInfo, + IN WORD nSapType +); + +DWORD +NwGetService( + IN LPWSTR Reserved, + IN WORD nSapType, + IN LPWSTR lpServiceName, + IN DWORD dwProperties, + OUT LPBYTE lpServiceInfo, + IN DWORD dwBufferLength, + OUT LPDWORD lpdwBytesNeeded +); + +VOID +NwInitializeServiceProvider( + VOID + ); + +VOID +NwTerminateServiceProvider( + VOID + ); + +#endif // _NWMISC_INCLUDED_ diff --git a/private/nw/svcdlls/nwwks/inc/nwreg.h b/private/nw/svcdlls/nwwks/inc/nwreg.h new file mode 100644 index 000000000..c7b4a162c --- /dev/null +++ b/private/nw/svcdlls/nwwks/inc/nwreg.h @@ -0,0 +1,85 @@ +/*++ + +Copyright (c) 1992-1993 Microsoft Corporation + +Module Name: + + nwreg.h + +Abstract: + + Header which specifies the misc registry parameters and helper + routines used by the workstation service. + +Author: + + Rita Wong (ritaw) 22-Mar-1993 + +Revision History: + + ChuckC 11-Dec-93 Split off the registry names to nwrnames.h + +--*/ + +#ifndef _NWREG_INCLUDED_ +#define _NWREG_INCLUDED_ + +#include + +// +// Default print option +// +#define NW_PRINT_OPTION_DEFAULT 0x98 +#define NW_GATEWAY_PRINT_OPTION_DEFAULT 0x88 + +#define NW_DOMAIN_USER_SEPARATOR L'*' +#define NW_DOMAIN_USER_SEPARATOR_STR L"*" + +#define NW_MAX_LOGON_ID_LEN 17 + +DWORD +NwReadRegValue( + IN HKEY Key, + IN LPWSTR ValueName, + OUT LPWSTR *Value + ); + +VOID +NwLuidToWStr( + IN PLUID LogonId, + OUT LPWSTR LogonIdStr + ); + +VOID +NwWStrToLuid( + IN LPWSTR LogonIdStr, + OUT PLUID LogonId + ); + +VOID +NwDeleteCurrentUser( + VOID + ); + +DWORD +NwDeleteServiceLogon( + IN PLUID Id OPTIONAL + ); + +DWORD +NwpRegisterGatewayShare( + IN LPWSTR ShareName, + IN LPWSTR DriveName + ); + +DWORD +NwpClearGatewayShare( + IN LPWSTR ShareName + ); + +DWORD +NwpCleanupGatewayShares( + VOID + ); + +#endif // _NWREG_INCLUDED_ diff --git a/private/nw/svcdlls/nwwks/inc/rnrdefs.h b/private/nw/svcdlls/nwwks/inc/rnrdefs.h new file mode 100644 index 000000000..72c405180 --- /dev/null +++ b/private/nw/svcdlls/nwwks/inc/rnrdefs.h @@ -0,0 +1,226 @@ +/*++ + +Copyright (c) 1992-1993 Microsoft Corporation + +Module Name: + + nwmisc.h + +Abstract: + + Header which specifies the misc routines used by the workstation service. + +Author: + + Arnold Miller (arnoldm) 15-Feb-1996 + +Revision History: + + +--*/ +#ifndef __RNRDEFS_H__ +#define __RNRDEFS_H__ + +#include "sapcmn.h" + +// +// Bit defs for the protocols +// + +#define IPX_BIT 1 +#define SPX_BIT 2 +#define SPXII_BIT 4 + +// +// forwards\ +// + +struct _SAP_RNR_CONTEXT; +// +// Bindery control +// + +typedef struct _BinderyControl +{ + LONG lIndex; +} BINDERYCONTROL, *PBINDERYCONTROL; + +// +// SAP RnR context information. This is linked off of the +// SAP_BCAST_CONTROL defined ahead +// + +typedef struct _SAP_DATA +{ + struct _SAP_DATA * sapNext; + // save everything except hop count + WORD sapid; // for a sanity check + CHAR sapname[48]; // what we don't know + BYTE socketAddr[IPX_ADDRESS_LENGTH]; // and what we seek +} SAP_DATA, *PSAP_DATA; + +// +// +// Sap bcast control +// An important note. fFlags is set only by the thread executing +// a LookupServiceBegin or a LookupServiceNext. It may be tested by +// any thread. Its counterpart, dwControlFlags in SAP_RNR_CONTEXT +// is reserved for setting by LookupServiceBegin and LookupServiceEnd. Once +// again any thread may look at it. This insures no loss of data on an +// MP machine without needing a critical section. +// + +typedef struct _SAP_BCAST_CONTROL +{ + DWORD dwIndex; // loop control + DWORD dwTickCount; // tick count of last send + DWORD fFlags; // various flags + PVOID pvArg; + SOCKET s; + CRITICAL_SECTION csMonitor; // This is to keep + // out internal structures sane. Note + // it does not provide rational + // serialization. In particular, if + // multiple threads use the same + // handle simultaneously, there is no + // guaranteed serialization. + PSAP_DATA psdNext1; // next to return + PSAP_DATA psdHead; // list head + PSAP_DATA psdTail; + struct _SAP_RNR_CONTEXT * psrc; // need this + DWORD (*Func)(PVOID pvArg1, PSAP_IDENT_HEADER pSap, PDWORD pdwErr); + BOOL (*fCheckCancel)(PVOID pvArg1); + WORD wQueryType; +} SAP_BCAST_CONTROL, *PSAP_BCAST_CONTROL; + +// +// Flags for above + +#define SBC_FLAG_NOMORE 0x1 + +// +// Structure used by the old RnR Sap lookup as the pvArg value in +// SAP_BCAST control +// + +#ifndef _NTDEF_ +typedef struct _STRING { + USHORT Length; + USHORT MaximumLength; +#ifdef MIDL_PASS + [size_is(MaximumLength), length_is(Length) ] +#endif // MIDL_PASS + PCHAR Buffer; +} OEM_STRING; +#endif + +typedef struct _OldRnRSap +{ + OEM_STRING * poem; + HANDLE hCancel; + LPVOID lpCsAddrBuffer; + LPDWORD lpdwBufferLength; + DWORD nProt; + LPDWORD lpcAddress; +} OLDRNRSAP, *POLDRNRSAP; + +// +// Return codes from the coroutine +// + +#define dwrcDone 1 // all done, return success +#define dwrcCancel 2 // all done, return cancelled +#define dwrcNoWait 3 // keep going, but never wait. +#define dwrcNil 4 // do whatever you want + +// +// Sap service query packet format +// + +typedef struct _SAP_REQUEST { + USHORT QueryType; + USHORT ServerType; +} SAP_REQUEST, *PSAP_REQUEST; + +#define QT_GENERAL_QUERY 1 +#define QT_NEAREST_QUERY 3 + +// The context information we put inside of an RNRNSHANDLE structure +// to keep track of what we are doing +// N.B. See comment on SAP_BCAST_CONTROL about the use of dwControlFlags. +// + +typedef struct _SAP_RNR_CONTEXT +{ + struct _SAP_RNR_CONTEXT * pNextContext; + LONG lSig; + LONG lInUse; + DWORD dwCount; // count of queries made + DWORD fFlags; // always nice to have + DWORD dwControlFlags; + DWORD fConnectionOriented; + WORD wSapId; // the type desired + HANDLE Handle; // the corresponding RnR handle + DWORD nProt; + GUID gdType; // the type we are seeking + GUID gdProvider; + HANDLE hServer; + WCHAR wszContext[48]; + WCHAR chwName[48]; // the name, if any + CHAR chName[48]; // OEM form of the name for SAP + DWORD dwUnionType; // type of lookup, once we know + union + { + SAP_BCAST_CONTROL sbc; + BINDERYCONTROL bc; + } u_type; + PVOID pvVersion; // a trick to get the version here. +} SAP_RNR_CONTEXT, *PSAP_RNR_CONTEXT; + +#define RNR_SIG 0xaabbccdd +// +// union types +// + +#define LOOKUP_TYPE_NIL 0 +#define LOOKUP_TYPE_SAP 1 +#define LOOKUP_TYPE_BINDERY 2 + + +#define SAP_F_END_CALLED 0x1 // generic cancel + + +// +// Defs for the bindery Class info +// BUGBUG. These probably should be elsewhere +// This defines the format of each ClassInfo property segement. It looks +// somewhat like an actual ClassInfo, but considerably compressed. Note +// due to marshalling problems, any complex value, such as a GUID, +// should be stored as a string and then imported. Hence, we define +// types for what we can anticipate. +// + +typedef struct _BinderyClasses +{ + BYTE bType; + BYTE bSizeOfType; + BYTE bSizeOfString; + BYTE bOffset; // where the data area begins + BYTE bFlags; + BYTE bFiller; + WORD wNameSpace; // the applicable namespace + CHAR cDataArea[120]; // where the type and string are placed +} BINDERYCLASSES, *PBINDERYCLASSES; + +#define BT_DWORD 1 // DWORD +#define BT_WORD 2 // WORD +#define BT_GUID 3 // a string GUID (ASCII) +#define BT_STR 3 // an OEM string +#define BT_OID 4 // an object ID (TBD) +#define BT_BSTR 5 // a binary string (very dangerous) +#define BT_WSTR 6 // UNICODE string. Unmarshalled! + + +#define RNRTYPE "RNR_TYPE" // prop containing the GUID +#define RNRCLASSES "RNR_CLASSES" // the other property +#endif diff --git a/private/nw/svcdlls/nwwks/inc/sapcmn.h b/private/nw/svcdlls/nwwks/inc/sapcmn.h new file mode 100644 index 000000000..fa8f8449e --- /dev/null +++ b/private/nw/svcdlls/nwwks/inc/sapcmn.h @@ -0,0 +1,66 @@ +/*++ + +Copyright (c) 1992-1993 Microsoft Corporation + +Module Name: + + sapcmn.h.h + +Abstract: + + Header containing the most basic common SAP definitions. This + was derived from the larger file, nwmisc.h in order to + be available to either the old RNR or the new RNR routines. + +Author: + + Arnold Miller (ArnoldM) 8-Dec-95 + +Revision History: + + ArnoldM 8-Dec-95 Created from pieces of nwmisc.h +--*/ + +#ifndef __SAPCMN_H__ +#define __SAPCMN_H__ +// +// Definitions common to client and server side files (getaddr.c and service.c) +// + +#define IPX_ADDRESS_LENGTH 12 +#define IPX_ADDRESS_NETNUM_LENGTH 4 +#define SAP_ADDRESS_LENGTH 15 +#define SAP_ADVERTISE_FREQUENCY 60000 // 60 seconds +#define SAP_MAXRECV_LENGTH 544 +#define SAP_OBJECT_NAME_MAX_LENGTH 48 + +// +// N.B. Keep the following defines in synch. +// +#define NW_RDR_PREFERRED_SERVER L"\\Device\\Nwrdr\\*" +#define NW_RDR_NAME L"\\Device\\Nwrdr\\" +#define NW_RDR_PREFERRED_SUFFIX L"*" +// +// Sap server identification packet format +// + +typedef struct _SAP_IDENT_HEADER { + USHORT ServerType; + UCHAR ServerName[48]; + UCHAR Address[IPX_ADDRESS_LENGTH]; + USHORT HopCount; +} SAP_IDENT_HEADER, *PSAP_IDENT_HEADER; + + +// +// Sap server identification packet format - Extended +// + +typedef struct _SAP_IDENT_HEADER_EX { + USHORT ResponseType; + USHORT ServerType; + UCHAR ServerName[SAP_OBJECT_NAME_MAX_LENGTH]; + UCHAR Address[IPX_ADDRESS_LENGTH]; + USHORT HopCount; +} SAP_IDENT_HEADER_EX, *PSAP_IDENT_HEADER_EX; +#endif diff --git a/private/nw/svcdlls/nwwks/inc/splutil.h b/private/nw/svcdlls/nwwks/inc/splutil.h new file mode 100644 index 000000000..8e8169eac --- /dev/null +++ b/private/nw/svcdlls/nwwks/inc/splutil.h @@ -0,0 +1,81 @@ +/*++ + +Copyright (c) 1992-1993 Microsoft Corporation + +Module Name: + + splutil.h + +Abstract: + + Header file for utilities used in Novell Print Provider + +Author: + + Yi-Hsin Sung (yihsins) 12-Apr-1993 + +Revision History: + +--*/ + +#ifndef _SPLUTIL_H_ +#define _SPLUTIL_H_ + +#define offsetof(type, identifier) (DWORD)(&(((type)0)->identifier)) + +extern DWORD PrinterInfo1Offsets[]; +extern DWORD PrinterInfo2Offsets[]; +extern DWORD PrinterInfo3Offsets[]; +extern DWORD JobInfo1Offsets[]; +extern DWORD JobInfo2Offsets[]; +extern DWORD AddJobInfo1Offsets[]; + +VOID +MarshallUpStructure( + LPBYTE lpStructure, + LPDWORD lpOffsets, + LPBYTE lpBufferStart +); + +VOID +MarshallDownStructure( + LPBYTE lpStructure, + LPDWORD lpOffsets, + LPBYTE lpBufferStart +); + +LPVOID +AllocNwSplMem( + IN DWORD flags, + IN DWORD cb + ); + +VOID +FreeNwSplMem( + IN LPVOID pMem, + IN DWORD cb + ); + +LPWSTR +AllocNwSplStr( + IN LPWSTR pStr + ); + +VOID +FreeNwSplStr( + IN LPWSTR pStr +); + +BOOL +ValidateUNCName( + IN LPWSTR pName +); + +LPWSTR +GetNextElement( + OUT LPWSTR *pPtr, + IN WCHAR token +); + + +#endif // _SPLUTIL_H -- cgit v1.2.3