#ifndef _PH_EMENU_H #define _PH_EMENU_H #ifdef __cplusplus extern "C" { #endif #define PH_EMENU_DISABLED 0x1 #define PH_EMENU_CHECKED 0x2 #define PH_EMENU_HIGHLIGHT 0x4 #define PH_EMENU_MENUBARBREAK 0x8 #define PH_EMENU_MENUBREAK 0x10 #define PH_EMENU_DEFAULT 0x20 #define PH_EMENU_MOUSESELECT 0x40 #define PH_EMENU_RADIOCHECK 0x80 #define PH_EMENU_SEPARATECHECKSPACE 0x100000 #define PH_EMENU_SEPARATOR 0x200000 #define PH_EMENU_TEXT_OWNED 0x80000000 #define PH_EMENU_BITMAP_OWNED 0x40000000 struct _PH_EMENU_ITEM; typedef VOID (NTAPI *PPH_EMENU_ITEM_DELETE_FUNCTION)( _In_ struct _PH_EMENU_ITEM *Item ); typedef struct _PH_EMENU_ITEM { ULONG Flags; ULONG Id; PWSTR Text; HBITMAP Bitmap; PVOID Parameter; PVOID Context; PPH_EMENU_ITEM_DELETE_FUNCTION DeleteFunction; PVOID Reserved; struct _PH_EMENU_ITEM *Parent; PPH_LIST Items; } PH_EMENU_ITEM, *PPH_EMENU_ITEM; typedef struct _PH_EMENU_ITEM PH_EMENU, *PPH_EMENU; PHLIBAPI PPH_EMENU_ITEM PhCreateEMenuItem( _In_ ULONG Flags, _In_ ULONG Id, _In_ PWSTR Text, _In_opt_ HBITMAP Bitmap, _In_opt_ PVOID Context ); PHLIBAPI VOID PhDestroyEMenuItem( _In_ PPH_EMENU_ITEM Item ); #define PH_EMENU_FIND_DESCEND 0x1 #define PH_EMENU_FIND_STARTSWITH 0x2 #define PH_EMENU_FIND_LITERAL 0x4 PHLIBAPI PPH_EMENU_ITEM PhFindEMenuItem( _In_ PPH_EMENU_ITEM Item, _In_ ULONG Flags, _In_opt_ PWSTR Text, _In_opt_ ULONG Id ); PHLIBAPI PPH_EMENU_ITEM PhFindEMenuItemEx( _In_ PPH_EMENU_ITEM Item, _In_ ULONG Flags, _In_opt_ PWSTR Text, _In_opt_ ULONG Id, _Out_opt_ PPH_EMENU_ITEM *FoundParent, _Out_opt_ PULONG FoundIndex ); PHLIBAPI ULONG PhIndexOfEMenuItem( _In_ PPH_EMENU_ITEM Parent, _In_ PPH_EMENU_ITEM Item ); PHLIBAPI VOID PhInsertEMenuItem( _Inout_ PPH_EMENU_ITEM Parent, _Inout_ PPH_EMENU_ITEM Item, _In_ ULONG Index ); PHLIBAPI BOOLEAN PhRemoveEMenuItem( _Inout_opt_ PPH_EMENU_ITEM Parent, _In_opt_ PPH_EMENU_ITEM Item, _In_opt_ ULONG Index ); PHLIBAPI VOID PhRemoveAllEMenuItems( _Inout_ PPH_EMENU_ITEM Parent ); PHLIBAPI PPH_EMENU PhCreateEMenu( VOID ); PHLIBAPI VOID PhDestroyEMenu( _In_ PPH_EMENU Menu ); #define PH_EMENU_CONVERT_ID 0x1 typedef struct _PH_EMENU_DATA { PPH_LIST IdToItem; } PH_EMENU_DATA, *PPH_EMENU_DATA; PHLIBAPI VOID PhInitializeEMenuData( _Out_ PPH_EMENU_DATA Data ); PHLIBAPI VOID PhDeleteEMenuData( _Inout_ PPH_EMENU_DATA Data ); PHLIBAPI HMENU PhEMenuToHMenu( _In_ PPH_EMENU_ITEM Menu, _In_ ULONG Flags, _Inout_opt_ PPH_EMENU_DATA Data ); PHLIBAPI VOID PhEMenuToHMenu2( _In_ HMENU MenuHandle, _In_ PPH_EMENU_ITEM Menu, _In_ ULONG Flags, _Inout_opt_ PPH_EMENU_DATA Data ); PHLIBAPI VOID PhHMenuToEMenuItem( _Inout_ PPH_EMENU_ITEM MenuItem, _In_ HMENU MenuHandle ); PHLIBAPI VOID PhLoadResourceEMenuItem( _Inout_ PPH_EMENU_ITEM MenuItem, _In_ HINSTANCE InstanceHandle, _In_ PWSTR Resource, _In_ ULONG SubMenuIndex ); #define PH_EMENU_SHOW_SEND_COMMAND 0x1 #define PH_EMENU_SHOW_LEFTRIGHT 0x2 PHLIBAPI PPH_EMENU_ITEM PhShowEMenu( _In_ PPH_EMENU Menu, _In_ HWND WindowHandle, _In_ ULONG Flags, _In_ ULONG Align, _In_ ULONG X, _In_ ULONG Y ); // Convenience functions PHLIBAPI BOOLEAN PhSetFlagsEMenuItem( _Inout_ PPH_EMENU_ITEM Item, _In_ ULONG Id, _In_ ULONG Mask, _In_ ULONG Value ); FORCEINLINE BOOLEAN PhEnableEMenuItem( _Inout_ PPH_EMENU_ITEM Item, _In_ ULONG Id, _In_ BOOLEAN Enable ) { return PhSetFlagsEMenuItem(Item, Id, PH_EMENU_DISABLED, Enable ? 0 : PH_EMENU_DISABLED); } PHLIBAPI VOID PhSetFlagsAllEMenuItems( _In_ PPH_EMENU_ITEM Item, _In_ ULONG Mask, _In_ ULONG Value ); #define PH_EMENU_MODIFY_TEXT 0x1 #define PH_EMENU_MODIFY_BITMAP 0x2 PHLIBAPI VOID PhModifyEMenuItem( _Inout_ PPH_EMENU_ITEM Item, _In_ ULONG ModifyFlags, _In_ ULONG OwnedFlags, _In_opt_ PWSTR Text, _In_opt_ HBITMAP Bitmap ); #ifdef __cplusplus } #endif #endif