/********************************************************************/ /** Microsoft LAN Manager **/ /** Copyright(c) Microsoft Corp., 1987-1990 **/ /********************************************************************/ /* * FILE STATUS: * 10/11/90 jonn created * 01/10/91 jonn removed PSHORT, PUSHORT * 01/27/91 jonn changed from CFGFILE, added UserProfileInit/Free * 02/02/91 jonn added UserProfileWrite/Clear, removed Confirm, * redefined Set. * 02/04/91 jonn added cpszUsername param to Query, Enum, Set * 03/08/91 chuckc added UserPreferenceXXX() calls. * 04/16/91 jonn added USERPREF_CONFIRMATION and USERPREF_ADMINMENUS * 05/08/91 jonn Added canonicalization of netnames, canonicalize * on read * 06-Apr-92 beng Nuked PSZ and CPSZ types (Unicode pass) */ /**************************************************************************** MODULE: UIProf.h PURPOSE: Handles low-level manipulation of user profile files Handles user preferences (saved info) FUNCTIONS: UserProfileInit() - Initializes the user profile module. The cached profile is initially empty. UserProfileFree() - Frees memory used by the user profile module. UserProfileRead() - Caches the profile for the specified user from permanent storage into a global data structure, for future UserProfileQuery/Enum calls. Call with NULL to clear the cached profile. UserProfileWrite() - Writes the cached profile into permanent storage. UserProfileQuery() - Returns one entry from the cached profile. UserProfileEnum() - Lists all entries in the cached profile. UserProfileSet() - Changes the cached profile. It is generally advisable to immediately precede this call with UserProfileRead, and immediately follow it with UserProfileWrite. UserPreferenceQuery() - queries a single user preference string. UserPreferenceSet() - saves a single user preference string. UserPreferenceQueryBool() - queries a user preference bool value. UserPreferenceSetBool() - saves a user preference bool value. COMMENTS: UserProfile routines: Under LM30, the profile in $(LANROOT) will only be used if the profile stored in the DS is unavailable. Be sure to cache a user's profile before calling UserProfileQuery, UserProfileEnum or UserProfileSet. These routines will fail if no profile is currently cached. The cpszUsername argument is handled differently from different APIs. UserProfileRead and UserProfileWrite use it to specify the user profile to read or write. UserProfileRead will also remember the last username in a static variable whether the call succeeds or not. Null or empty user names clear the stored profile in UserProfileRead, and return NERR_BadUsername in UserProfileWrite. UserProfileQuery, Enum and Set compare cpszUsername with the last username remembered by UserProfileRead. If UserProfileRead has never been called, or if it was last called with a different username (NULL and empty string are equivalent), these calls fail with ERROR_GEN_FAILURE. In this way, you can use the cpszUsername parameter to check whether the correct profile is loaded, or you can use it to check whether your module has just started and should perform the initial UserProfileRead. Note that UserProfileRead(NULL) will prevent the ERROR_GEN_FAILURE return code when cpszUsername==NULL. Remember that a user may be logged on from several different machines, and that the cached profile is not automatically updated. When the profile is to be changed in permanent storage, it is generally advisable to reread the profile from permanent storage with UserProfileRead, make the change in the cache with userProfileSet, and immediately rewrite the profile with UserProfileWrite; this reduces the chance that another user's changes will be lost. When successful, the UserProfile APIs return NO_ERROR (0). The following are the error codes returned by the UserProfile APIs: NERR_BadUsername: bad username argument NERR_InvalidDevice: bad devicename argument ERROR_BAD_NETPATH: bad lanroot argument ERROR_BAD_NET_NAME: bad remotename argument NERR_UseNotFound: the specified device is not listed in the profile ERROR_NOT_ENOUGH_MEMORY: lack of global memory or overfull profile ERROR_GET_FAILURE: username mismatch ERROR_FILE_NOT_FOUND: any file read error ERROR_WRITE_FAULT: any file write error BUGBUG We must determine correct behavior when no user is logged on. BUGBUG Do we return ERROR_GEN_FAILURE? NO_ERROR? what? User preferences routines: These routines read and write sticky values in some section of the local LANMAN.INI. These sticky values are therefore all local to the workstation; this mechanism is not intended for values associated with a user. Unlike the UserProfile routines, these routines do not cache any data. ****************************************************************************/ /* returncodes: */ /* global macros */ #define PROFILE_DEFAULTFILE "LMUSER.INI" #define USERPREF_MAX 256 // arbitrary limit to ease mem alloc #define USERPREF_YES "yes" // this is not internationalized. #define USERPREF_NO "no" // ditto #define USERPREF_NONE 0 // no such value #define USERPREF_AUTOLOGON 0x1 // auto logon #define USERPREF_AUTORESTORE 0x2 // auto restore profile #define USERPREF_SAVECONNECTIONS 0x3 // auto save connections #define USERPREF_USERNAME 0x4 // user name #define USERPREF_CONFIRMATION 0x5 // confirm actions? #define USERPREF_ADMINMENUS 0x6 // Admin menus (PrintMgr) #ifdef __cplusplus extern "C" { #endif /* functions: */ /* * UserProfileInit prepares the profile library. This API must be * called exactly once, and before any other UserProfile APIs. * * error returns: * ERROR_NOT_ENOUGH_MEMORY */ USHORT UserProfileInit( void ); /* * UserProfileFree releases memory claimed by the profile library. * Do not call UserProfileFree unless the profile library is initialized. * After UserProfileFree, the only permissible UserProfile call is * userProfileInit. * * error returns: * */ USHORT UserProfileFree( void ); /* * UserProfileRead attempt to cache the user's profile as stored in * permanent storage (\LMUSER.INI, or the DS for LM30). * * Call with cpszUsername==NULL or cpszUsername=="" to clear cached profile. * In this case, cpszLanroot is ignored. * * UserProfileRead updates the username associated with the current * profile, for use by UserProfileQuery/Enum/Set. * * error returns: * NERR_BadUsername * ERROR_BAD_NETPATH * ERROR_NOT_ENOUGH_MEMORY: includes "profile full" state * ERROR_FILE_NOT_FOUND */ USHORT UserProfileRead( const TCHAR * pszUsername, const TCHAR * pszLanroot ); /* * UserProfileWrite attempts to write the user's profile back to * permanent storage (\LMUSER.INI, or the DS for LM30). * * error returns: * NERR_BadUsername * ERROR_BAD_NETPATH * ERROR_NOT_ENOUGH_MEMORY * ERROR_WRITE_FAULT */ USHORT UserProfileWrite( const TCHAR * pszUsername, const TCHAR * pszLanroot ); /* * psAsgType returns the device type as in use_info_1 or (LM30) use_info_2 * fields ui1_asg_type or (LM30) ui2_asg_type. pusResType returns * the device name type (e.g. UNC, alias, DFS, DS) as in the * use_info_2 ui1_res_type field. Either of these parameters may be * passed as NULL by programs which do not care about the return value. * * cpszUsername is used to confirm that the cached profile is for the * named user. Pass NULL to accept any cached profile (but still * reject if UserProfileRead has not been called). * * error returns: * ERROR_GEN_FAILURE: cached profile is not for the named user * NERR_BadUsername * NERR_InvalidDevice * NERR_UseNotFound * ERROR_NOT_ENOUGH_MEMORY * ERROR_INSUFFICIENT_BUFFER */ USHORT UserProfileQuery( const TCHAR * pszUsername, const TCHAR * pszDeviceName, TCHAR * pszBuffer, // returns UNC, alias or domain name USHORT usBufferSize, // length of above buffer short far * psAsgType, // as ui1_asg_type / ui2_asg_type // ignored if NULL unsigned short far * pusResType // ignore / as ui2_res_type // ignored if NULL ); /* * Returns a list of all devices for which the cached profile lists a * connection, separated by nulls, with a null-null at the end. * For example, "LPT1:\0D:\0F:\0" (don't forget the extra '\0' * implicit in "" strings) * * cpszUsername is used to confirm that the cached profile is for the * named user. Pass NULL to accept any cached profile (but still * reject if UserProfileRead has not been called). * * error returns: * NERR_BadUsername * ERROR_NOT_ENOUGH_MEMORY * ERROR_INSUFFICIENT_BUFFER */ USHORT UserProfileEnum( const TCHAR * pszUsername, TCHAR * pszBuffer, // returns NULL-NULL list of device names USHORT usBufferSize // length of above buffer ); /* * Changes the cached profile. Follow this call with a call to * UserProfileWrite to write the profile to permanent storage. * * The user is expected to ensure that usResType corresponds to * the type of the remote resource, and that device pszDeviceName * can be connected to a resource of that type. * * Does not canonicalize cpszCanonRemoteName, caller must do this * * cpszUsername is used to confirm that the cached profile is for the * named user. Pass NULL to accept any cached profile (but still * reject if no user profile is cached). * * error returns: * ERROR_GEN_FAILURE: cached profile is not for the named user * NERR_InvalidDevice: bad cpszDeviceName * ERROR_BAD_NET_NAME: bad cpszRemoteName * ERROR_NOT_ENOUGH_MEMORY: includes "profile full" state */ USHORT UserProfileSet( const TCHAR * pszUsername, const TCHAR * pszDeviceName, const TCHAR * pszRemoteName, short sAsgType, // as ui2_asg_type unsigned short usResType // as ui2_res_type ); /************************************************************************* NAME: UserPreferenceQuery SYNOPSIS: Queries a user preference (ie remembered string). INTERFACE: UserPreferenceQuery( usKey, pchValue, cbLen ) usKey - will indicate which value we want, as defined in uiprof.h. pchValue - pointer to buffer that will receive value cbLen - size of buffer return value is NERR_Success, ERROR_INAVALID_PARAMETER, or NetConfigGet2 error. USES: Use to recall values saved by UserPrefenceSet(), normally things like default logon name, etc. CAVEATS: NOTES: Currently, the values are stored in LANMAN.INI, and hence each value is per machine. HISTORY: chuckc 7-Mar-1991 Created **************************************************************************/ USHORT UserPreferenceQuery( USHORT usKey, TCHAR FAR * pchValue, USHORT cbLen); /************************************************************************* NAME: UserPreferenceSet SYNOPSIS: Sets a user preference (remembers a string). INTERFACE: UserPreferenceSet( usKey, pchValue ) usKey - will indicate which value we want, as defined in uiprof.h. pchValue - pointer to null terminates string to be remembered return value is NERR_Success, ERROR_INAVALID_PARAMETER, or NetConfigSet error. USES: Use to save values to be retrieved by UserPrefenceQuery(), normally things like default logon name, etc. CAVEATS: NOTES: Currently, the values are stored in LANMAN.INI, and hence each value is per machine. HISTORY: chuckc 7-Mar-1991 Created **************************************************************************/ USHORT UserPreferenceSet( USHORT usKey, TCHAR FAR * pchValue); /************************************************************************* NAME: UserPreferenceQueryBool SYNOPSIS: Queries a BOOL a user preference (remembered flag). INTERFACE: UserPreferenceQueryBool( usKey, pfValue ) usKey - will indicate which value we want, as defined in uiprof.h. pfValue - pointer to BOOL that will contain value return value is NERR_Success, ERROR_INAVALID_PARAMETER, or UserPreferenceQuery error. USES: Use to retrieve flags set by by UserPrefenceSetBool(), normally things like auto logon, etc. CAVEATS: NOTES: Currently, the values are stored in LANMAN.INI, and hence each value is per machine. This func calls UserPreferenceQuery(), taking "yes" or "YES" to be true, "no" or "NO" to be false. HISTORY: chuckc 7-Mar-1991 Created **************************************************************************/ USHORT UserPreferenceQueryBool( USHORT usKey, BOOL FAR * pfValue) ; /************************************************************************* NAME: UserPreferenceSetBool SYNOPSIS: Sets a user preference flag INTERFACE: UserPreferenceSetBool( usKey, fValue ) usKey - will indicate which value we want, as defined in uiprof.h. fValue - BOOL value, true or false return value is NERR_Success, ERROR_INAVALID_PARAMETER, or UserPreferenceSet error. USES: Use to save values to be retrieved by UserPrefenceQueryBool(), normally flags like autologon, etc. CAVEATS: NOTES: Currently, the values are stored in LANMAN.INI, and hence each value is per machine. This func calls UserPreferenceSet(), taking "yes" or "YES" to be true, "no" or "NO" to be false. We also restrict values to length of < USERPREF_MAX. HISTORY: chuckc 7-Mar-1991 Created **************************************************************************/ USHORT UserPreferenceSetBool( USHORT usKey, BOOL fValue); #ifdef __cplusplus } #endif