text: /**********************************************************************/
  /**                       Microsoft Windows NT                       **/
  /**                Copyright(c) Microsoft Corp., 1992                **/
  /**********************************************************************/
  
  /*
      umx.h
      This file contains the common messages, manifests, types, and
      structures used by User Manager Extensions.
  
      NOTE:  You must include windows.h and lmcons.h *before* this file.
  
  
      FILE HISTORY:
          JonN        19-Nov-1992     Created, templated from SMX spec
          JonN        16-May-1996     Added GETCURFOCUS2
  
  */
  
  
  
  #ifndef _UMX_H_
  #define _UMX_H_
  
  
  
  //
  //  This is the maximum length allowed for an extension menu item.
  //
  
  #define UME_MENU_TEXT_LEN               50
  
  
  
  //
  //  This is the current version number of the extension interface.
  //  Version 0 is the original version (NT 3.x).
  //  Version 1 supports GETCURFOCUS2 (NT 4.x).
  //
  
  #define UME_VERSION                     1
  
  
  //
  //  These are the two listboxes in the User Manager main window.
  //
  
  #define UMS_LISTBOX_USERS               0
  #define UMS_LISTBOX_GROUPS              1
  
  
  //
  //  These are the messages sent from the extension to the
  //  User Manager application.
  //
  //      UM_GETSELCOUNT
  //
  //              Purpose - Retrieves the number of selected items in
  //                        the specified listbox.
  //
  //              wParam  - Listbox index.  This 0-based index specifies
  //                        the listbox to query.  For the User Manager,
  //                        this may be either UMS_LISTBOX_USERS or
  //                        UMS_LISTBOX_GROUPS.
  //
  //              lParam  - Points to a UMS_GETSELCOUNT structure.
  //
  //              Returns - TRUE if successful, FALSE if unsuccessful.
  //
  //
  //      UM_GETUSERSEL[AW]
  //
  //              Purpose - Retrieves a particular selection.
  //
  //              wParam  - Selection index.  This 0-based index specifies
  //                        the selected item to query.  This is used here
  //                        since the Users listbox is multiple-select.
  //
  //              lParam  - Points to a UMS_GETSEL[AW] structure.
  //
  //              Returns - TRUE if successful, FALSE if unsuccessful.
  //
  //
  //      UM_GETGROUPSEL[AW]
  //
  //              Purpose - Retrieves a particular selection.
  //
  //              wParam  - Selection index.  This 0-based index specifies
  //                        the selected item to query.  This is useful
  //                        for muliple-select listboxes.  Since the Groups
  //                        listbox is single-select, this value must always
  //                        be zero.
  //
  //              lParam  - Points to a UMS_GETSEL[AW] structure.
  //
  //              Returns - TRUE if successful, FALSE if unsuccessful.
  //
  //
  //      UM_GETCURFOCUS[AW][2]
  //
  //              Purpose - Retrieves the current application focus.
  //                        New clients should use version 2 when
  //                        UMS_LOADMENU.dwVersion is 1 or greater.
  //
  //              wParam  - Must be zero.
  //
  //              lParam  - Points to a UMS_GETCURFOCUS[2] structure.
  //
  //              Returns - TRUE if successful, FALSE if unsuccessful.
  //
  //
  //      UM_GETOPTIONS[2]
  //
  //              Purpose - Retrieves the current option settings
  //
  //              wParam  - Must be zero.
  //
  //              lParam  - Points to a UMS_GETOPTIONS[2] structure.
  //
  //              Returns - TRUE if successful, FALSE if unsuccessful.
  //
  
  #define UM_GETSELCOUNT                  (WM_USER + 1000)
  #define UM_GETUSERSELA                  (WM_USER + 1001)
  #define UM_GETUSERSELW                  (WM_USER + 1002)
  #define UM_GETGROUPSELA                 (WM_USER + 1003)
  #define UM_GETGROUPSELW                 (WM_USER + 1004)
  #define UM_GETCURFOCUSA                 (WM_USER + 1005)
  #define UM_GETCURFOCUSW                 (WM_USER + 1006)
  #define UM_GETOPTIONS                   (WM_USER + 1007)
  #define UM_GETOPTIONS2                  (WM_USER + 1008)
  #define UM_GETCURFOCUS2A                (WM_USER + 1009)
  #define UM_GETCURFOCUS2W                (WM_USER + 1010)
  
  #ifdef UNICODE
  #define UM_GETUSERSEL                 UM_GETUSERSELW
  #define UM_GETGROUPSEL                UM_GETGROUPSELW
  #define UM_GETCURFOCUS                UM_GETCURFOCUSW
  #define UM_GETCURFOCUS2               UM_GETCURFOCUS2W
  #else   // !UNICODE
  #define UM_GETUSERSEL                 UM_GETUSERSELA
  #define UM_GETGROUPSEL                UM_GETGROUPSELA
  #define UM_GETCURFOCUS                UM_GETCURFOCUSA
  #define UM_GETCURFOCUS2               UM_GETCURFOCUS2A
  #endif  // UNICODE
  
  
  
  //
  //  These structures are used when the extension is
  //  communicating with the application.
  //
  
  
  //
  //  The UMS_LOADMENU[AW] structure is passed to the extension's
  //  UMELoadMenu[AW] entrypoint when the extension is loaded.
  //
  //      dwVersion       - On entry to UMELoadMenu[AW], this will
  //                        contain the maximum extension version
  //                        supported by the User Manager.  If the
  //                        extension supports a lower version, it
  //                        should set this field appropriately before
  //                        returning.  The User Manager will use
  //                        the returned value to determine the
  //                        capabilities of the extension.
  //
  //                        Version 0 is the original version (NT 3.x).
  //                        Version 1 supports GETCURFOCUS2.
  //
  //      szMenuName      - The name of the menu item that is to appear
  //                        in the app's main menu.  This value will also
  //                        appear in the "Help On Extensions" submene and
  //                        the "View" menu.
  //
  //      hMenu           - A valid HMENU for the popup-menu to be inserted
  //                        into the app's main menu.  Ownership of this
  //                        handle transfers to the User Manager.  The
  //                        extension should *not* destroy this handle.
  //
  //      szHelpFileName  - The name of the help file associated with this
  //                        extension.  This file will be used for the
  //                        "Help On Extensions" menu.  This will also be
  //                        used when the user presses [F1] while the
  //                        extension's menu is dropped.
  //
  //      dwMenuDelta     - The User Manager will apply this delta
  //                        to each menu ID present in hMenu.  This is
  //                        to prevent conflicts with other extension's
  //                        menu IDs.
  //
  
  typedef struct _UMS_LOADMENUA
  {
      DWORD       dwVersion;
      CHAR        szMenuName[UME_MENU_TEXT_LEN + 1];
      HMENU       hMenu;
      CHAR        szHelpFileName[MAX_PATH];
      DWORD       dwMenuDelta;
  
  } UMS_LOADMENUA, * PUMS_LOADMENUA;
  
  typedef struct _UMS_LOADMENUW
  {
      DWORD       dwVersion;
      WCHAR       szMenuName[UME_MENU_TEXT_LEN + 1];
      HMENU       hMenu;
      WCHAR       szHelpFileName[MAX_PATH];
      DWORD       dwMenuDelta;
  
  } UMS_LOADMENUW, * PUMS_LOADMENUW;
  
  #ifdef UNICODE
  #define UMS_LOADMENU                    UMS_LOADMENUW
  #define PUMS_LOADMENU                   PUMS_LOADMENUW
  #else   // !UNICODE
  #define UMS_LOADMENU                    UMS_LOADMENUA
  #define PUMS_LOADMENU                   PUMS_LOADMENUA
  #endif  // UNICODE
  
  #define UM_SELTYPE_USER     0x10
  #define UM_SELTYPE_NORMALUSER   0x1 | UM_SELTYPE_USER
  #define UM_SELTYPE_REMOTEUSER   0x2 | UM_SELTYPE_USER
  #define UM_SELTYPE_GROUP    0x20
  #define UM_SELTYPE_LOCALGROUP   0x4 | UM_SELTYPE_GROUP
  #define UM_SELTYPE_GLOBALGROUP  0x8 | UM_SELTYPE_GROUP
  
  
  //
  //  The UMS_GETSEL[AW] structure is filled in by the User Manager
  //  when it handles UM_GETUSERSEL[AW] or UM_GETGROUPSEL[AW] messages.
  //  This is used to return the current selection to the extension.
  //  Note that this structure contains pointers.  The extension should not
  //  assume that these pointers will be valid forever, instead the
  //  extension should promptly copy these strings and use the copies.
  //
  //      dwRID         - The RID of the item.  Note that the RID is not
  //                      valid when the UMS_GETSEL describes a group.
  //
  //      pchName       - Will receive the name of the selected account.
  //
  //      dwSelType     - Will receive the account type mask associated
  //                      with the account.
  //
  //      pchName       - Will receive the fullname of the selected account.
  //                      Note that groups do not have fullnames.
  //
  //      pchComment    - Will receive the comment of the selected account.
  //
  
  typedef struct _UMS_GETSELA
  {
      DWORD       dwRID;
      LPSTR       pchName;
      DWORD       dwSelType;
      LPSTR       pchFullName;
      LPSTR       pchComment;
  
  } UMS_GETSELA, * PUMS_GETSELA;
  
  typedef struct _UMS_GETSELW
  {
      DWORD       dwRID;
      LPWSTR      pchName;
      DWORD       dwSelType;
      LPWSTR      pchFullName;
      LPWSTR      pchComment;
  
  } UMS_GETSELW, * PUMS_GETSELW;
  
  #ifdef UNICODE
  #define UMS_GETSEL                  UMS_GETSELW
  #define PUMS_GETSEL                 PUMS_GETSELW
  #else   // !UNICODE
  #define UMS_GETSEL                  UMS_GETSELA
  #define PUMS_GETSEL                 PUMS_GETSELA
  #endif  // UNICODE
  
  
  //
  //  The UMS_GETSELCOUNT structure is filled in by the User Manager
  //  when it handles the UM_GETSELCOUNT message.  This is used to
  //  return the number of selected items to the extension.  This could
  //  be more than 1 for the user listbox.
  //
  //      dwItems         - The number of selected items in the listbox.
  //
  
  typedef struct _UMS_GETSELCOUNT
  {
      DWORD       dwItems;
  } UMS_GETSELCOUNT, * PUMS_GETSELCOUNT;
  
  
  //
  //  The UMS_GETCURFOCUS structure is filled in by the User Manager
  //  when it handles the UM_GETCURFOCUS message.  This is used to
  //  return the current focus of the User Manager application.
  //
  //  UMS_GETCURFOCUS is outdated due to the change in server name length,
  //  use UMS_GETCURFOCUS2 when SMS_LOADMENU.dwVersion is 1 or greater.
  //
  //      szFocus         - The domain name or server name of the current
  //                        focus.  Server names can be distinguished
  //                        by the leading backslashes, or by dwFocusType.
  //
  //      dwFocusType     - This is the type of focus, either
  //                        UM_FOCUS_TYPE_DOMAIN (and szFocus is a domain name)
  //                        UM_FOCUS_TYPE_WINNT  (and szFocus is a server name)
  //                        UM_FOCUS_TYPE_LM     (and szFocus is a server name)
  //                        UM_FOCUS_TYPE_UNKNOWN
  //
  //      szFocusPDC      - This is the PDC of the domain of focus, and is valid
  //                        only if focus is set to UM_FOCUS_TYPE_DOMAIN.
  //
  //      psidFocus       - This points to the SID of the domain of focus.  It
  //                        may be NULL.  Note that this pointer will not be
  //                        valid forever, the extension should copy the SID
  //                        immediately if it intends to use it.
  //
  
  #define UM_FOCUS_TYPE_DOMAIN    1
  #define UM_FOCUS_TYPE_WINNT     2
  #define UM_FOCUS_TYPE_LM        3
  #define UM_FOCUS_TYPE_UNKNOWN   4
  
  typedef struct _UMS_GETCURFOCUSA
  {
      CHAR        szFocus[UNCLEN+1];
      DWORD       dwFocusType;
      CHAR        szFocusPDC[UNCLEN+1];
      PVOID       psidFocus;  // actually a SID pointer
  } UMS_GETCURFOCUSA, * PUMS_GETCURFOCUSA;
  
  typedef struct _UMS_GETCURFOCUSW
  {
      WCHAR       szFocus[UNCLEN+1];
      DWORD       dwFocusType;
      WCHAR       szFocusPDC[UNCLEN+1];
      PVOID       psidFocus;  // actually a SID pointer
  } UMS_GETCURFOCUSW, * PUMS_GETCURFOCUSW;
  
  typedef struct _UMS_GETCURFOCUS2A
  {
      CHAR        szFocus[MAX_PATH];
      DWORD       dwFocusType;
      CHAR        szFocusPDC[MAX_PATH];
      PVOID       psidFocus;  // actually a SID pointer
  } UMS_GETCURFOCUS2A, * PUMS_GETCURFOCUS2A;
  
  typedef struct _UMS_GETCURFOCUS2W
  {
      WCHAR       szFocus[MAX_PATH];
      DWORD       dwFocusType;
      WCHAR       szFocusPDC[MAX_PATH];
      PVOID       psidFocus;  // actually a SID pointer
  } UMS_GETCURFOCUS2W, * PUMS_GETCURFOCUS2W;
  
  #ifdef UNICODE
  #define UMS_GETCURFOCUS             UMS_GETCURFOCUSW
  #define PUMS_GETCURFOCUS            PUMS_GETCURFOCUSW
  #define UMS_GETCURFOCUS2            UMS_GETCURFOCUS2W
  #define PUMS_GETCURFOCUS2           PUMS_GETCURFOCUS2W
  #else   // UNICODE
  #define UMS_GETCURFOCUS             UMS_GETCURFOCUSA
  #define PUMS_GETCURFOCUS            PUMS_GETCURFOCUSA
  #define UMS_GETCURFOCUS2            UMS_GETCURFOCUS2A
  #define PUMS_GETCURFOCUS2           PUMS_GETCURFOCUS2A
  #endif  // UNICODE
  
  
  //
  //  The UMS_GETOPTIONS[2] structure is filled in by the User Manager
  //  when it handles the UM_GETOPTIONS[2] message.  This is used to
  //  return the current option settings of the User Manager application.
  //
  //      fSaveSettingsOnExit - Should User Manager settings be saved on exit?
  //
  //      fConfirmation   - Should permanent and/or dangerous actions be
  //                        confirmed?
  //
  //      fSortByFullName - Should the main user listbox be sorted by
  //                        fullname rather than by user name?
  //
  //      fMiniUserManager - (UMS_GETOPTIONS2 only) Is this the User Manager
  //                         rather than the User Manager for Domains?
  //
  //      fLowSpeedConnection - (UMS_GETOPTIONS2 only) Is the User Manager
  //                            optimized for use across a slow network link?
  //
  
  typedef struct _UMS_GETOPTIONS
  {
      BOOL        fSaveSettingsOnExit;
      BOOL        fConfirmation;
      BOOL        fSortByFullName;
  } UMS_GETOPTIONS, * PUMS_GETOPTIONS;
  
  typedef struct _UMS_GETOPTIONS2
  {
      BOOL        fSaveSettingsOnExit;
      BOOL        fConfirmation;
      BOOL        fSortByFullName;
      BOOL        fMiniUserManager;
      BOOL        fLowSpeedConnection;
  } UMS_GETOPTIONS2, * PUMS_GETOPTIONS2;
  
  
  
  
  //
  //  These are the names of the extension entrypoints.
  //
  
  #define SZ_UME_UNLOADMENU               "UMEUnloadMenu"
  #define SZ_UME_INITIALIZEMENU           "UMEInitializeMenu"
  #define SZ_UME_REFRESH                  "UMERefresh"
  #define SZ_UME_MENUACTION               "UMEMenuAction"
  
  #define SZ_UME_LOADMENUW                "UMELoadMenuW"
  #define SZ_UME_GETEXTENDEDERRORSTRINGW  "UMEGetExtendedErrorStringW"
  #define SZ_UME_CREATEW                  "UMECreateW"
  #define SZ_UME_DELETEW                  "UMEDeleteW"
  #define SZ_UME_RENAMEW                  "UMERenameW"
  
  #define SZ_UME_LOADMENUA                "UMELoadMenuA"
  #define SZ_UME_GETEXTENDEDERRORSTRINGA  "UMEGetExtendedErrorStringA"
  #define SZ_UME_CREATEA                  "UMECreateA"
  #define SZ_UME_DELETEA                  "UMEDeleteA"
  #define SZ_UME_RENAMEA                  "UMERenameA"
  
  #ifdef UNICODE
  #define SZ_UME_LOADMENU                 SZ_UME_LOADMENUW
  #define SZ_UME_GETEXTENDEDERRORSTRING   SZ_UME_GETEXTENDEDERRORSTRINGW
  #define SZ_UME_CREATE                   SZ_UME_CREATEW
  #define SZ_UME_DELETE                   SZ_UME_DELETEW
  #define SZ_UME_RENAME                   SZ_UME_RENAMEW
  #else   // !UNICODE
  #define SZ_UME_LOADMENU                 SZ_UME_LOADMENUA
  #define SZ_UME_GETEXTENDEDERRORSTRING   SZ_UME_GETEXTENDEDERRORSTRINGA
  #define SZ_UME_CREATE                   SZ_UME_CREATEA
  #define SZ_UME_DELETE                   SZ_UME_DELETEA
  #define SZ_UME_RENAME                   SZ_UME_RENAMEA
  #endif  // UNICODE
  
  
  
  //
  //  Typedefs for the extension entrypoints.
  //
  
  typedef DWORD (PASCAL * PUMX_LOADMENUW)( HWND          hWnd,
                                           PUMS_LOADMENUW pumsload );
  typedef DWORD (PASCAL * PUMX_LOADMENUA)( HWND          hWnd,
                                           PUMS_LOADMENUA pumsload );
  
  typedef LPWSTR (PASCAL * PUMX_GETEXTENDEDERRORSTRINGW)( VOID );
  typedef LPSTR  (PASCAL * PUMX_GETEXTENDEDERRORSTRINGA)( VOID );
  
  typedef VOID (PASCAL * PUMX_UNLOADMENU)( VOID );
  
  typedef VOID (PASCAL * PUMX_INITIALIZEMENU)( VOID );
  
  typedef VOID (PASCAL * PUMX_REFRESH)( HWND hwndParent );
  
  typedef VOID (PASCAL * PUMX_MENUACTION)( HWND  hwndParent,
                                           DWORD dwEventId );
  
  typedef VOID (PASCAL * PUMX_CREATEW)( HWND hwndParent,
                                        PUMS_GETSELW pumsSelection );
  typedef VOID (PASCAL * PUMX_CREATEA)( HWND hwndParent,
                                        PUMS_GETSELA pumsSelection );
  
  typedef VOID (PASCAL * PUMX_DELETEW)( HWND hwndParent,
                                        PUMS_GETSELW pumsSelection );
  typedef VOID (PASCAL * PUMX_DELETEA)( HWND hwndParent,
                                        PUMS_GETSELA pumsSelection );
  
  typedef VOID (PASCAL * PUMX_RENAMEW)( HWND hwndParent,
                                        PUMS_GETSELW pumsSelection,
                                        LPWSTR       pchNewName    );
  typedef VOID (PASCAL * PUMX_RENAMEA)( HWND hwndParent,
                                        PUMS_GETSELA pumsSelection,
                                        LPSTR        pchNewName    );
  
  
  #ifdef  UNICODE
  #define PUMX_LOADMENU                   PUMX_LOADMENUW
  #define PUMX_GETEXTENDEDERRORSTRING     PUMX_GETEXTENDEDERRORSTRINGW
  #define PUMX_CREATE                     PUMX_CREATEW
  #define PUMX_DELETE                     PUMX_DELETEW
  #define PUMX_RENAME                     PUMX_RENAMEW
  #else   // !UNICODE
  #define PUMX_LOADMENU                   PUMX_LOADMENUA
  #define PUMX_GETEXTENDEDERRORSTRING     PUMX_GETEXTENDEDERRORSTRINGA
  #define PUMX_CREATE                     PUMX_CREATEA
  #define PUMX_DELETE                     PUMX_DELETEA
  #define PUMX_RENAME                     PUMX_RENAMEA
  #endif  // UNICODE
  
  
  
  //
  //  Prototypes for the extension entrypoints.
  //
  
  DWORD PASCAL UMELoadMenuA( HWND           hwndMessage,
                             PUMS_LOADMENUA pumsload );
  
  DWORD PASCAL UMELoadMenuW( HWND           hwndMessage,
                             PUMS_LOADMENUW pumsload );
  
  LPSTR  PASCAL UMEGetExtendedErrorStringA( VOID );
  
  LPWSTR PASCAL UMEGetExtendedErrorStringW( VOID );
  
  VOID PASCAL UMEUnloadMenu( VOID );
  
  VOID PASCAL UMEInitializeMenu( VOID );
  
  VOID PASCAL UMERefresh( HWND hwndParent );
  
  VOID PASCAL UMEMenuAction( HWND hwndParent,
                             DWORD dwEventId );
  
  VOID PASCAL UMECreateA( HWND hwndParent,
                          PUMS_GETSELA pumsSelection );
  VOID PASCAL UMECreateW( HWND hwndParent,
                          PUMS_GETSELW pumsSelection );
  
  VOID PASCAL UMEDeleteA( HWND hwndParent,
                          PUMS_GETSELA pumsSelection );
  VOID PASCAL UMEDeleteW( HWND hwndParent,
                          PUMS_GETSELW pumsSelection );
  
  VOID PASCAL UMERenameA( HWND hwndParent,
                          PUMS_GETSELA pumsSelection,
                          LPSTR pchNewName );
  VOID PASCAL UMERenameW( HWND hwndParent,
                          PUMS_GETSELW pumsSelection,
                          LPWSTR pchNewName );
  
  
  #endif  // _UMX_H_
  
  