def add_submenu_item(h_menu, name, w_id=None): h_submenu = user32.CreatePopupMenu() mi_info = MENUITEMINFOW() mi_info.cbSize = ctypes.sizeof(MENUITEMINFOW) mi_info.fMask = MIIM_STRING | MIIM_SUBMENU | MIIM_ID | MIIM_BITMAP mi_info.fState = MFS_ENABLED mi_info.hSubMenu = h_submenu mi_info.wID = random.randint(0x10, 0xff) if w_id is None else w_id mi_info.dwTypeData = name mi_info.hbmpItem = HBMMENU_SYSTEM # (required to set nPosition to 1 in trigger) item = UNICODE_STRING.from_string(name) result = error_on_null( syscall.NtUserThunkedMenuItemInfo( h_menu, # HMENU hMenu 0, # UINT nPosition False, # BOOL fByPosition True, # BOOL fInsert ctypes.byref(mi_info), # LPMENUITEMINFOW lpmii ctypes.byref(item) # PUNICODE_STRING pstrItem )) print("NtUserThunkedMenuItemInfo submenu result: 0x{0:08x}".format(result)) return h_submenu
def trigger(h_menu, name, w_id, n_position, f_by_position): mi_info = MENUITEMINFOW() mi_info.cbSize = ctypes.sizeof(MENUITEMINFOW) mi_info.fMask = MIIM_STRING | MIIM_ID mi_info.fType = MFT_STRING mi_info.fState = MFS_ENABLED mi_info.wID = w_id item = UNICODE_STRING.from_string(name) result = error_on_null(syscall.NtUserThunkedMenuItemInfo( h_menu, # HMENU hMenu n_position, # UINT nPosition f_by_position, # BOOL fByPosition True, # BOOL fInsert ctypes.byref(mi_info), # LPMENUITEMINFOW lpmii ctypes.byref(item) # PUNICODE_STRING pstrItem )) return result
def add_menu_item(h_menu, name, w_id=None): mi_info = MENUITEMINFOW() mi_info.cbSize = ctypes.sizeof(MENUITEMINFOW) mi_info.fMask = MIIM_STRING | MIIM_ID mi_info.fType = MFT_STRING mi_info.fState = MFS_ENABLED mi_info.wID = random.randint(0x1000, 0xffff) if w_id is None else w_id item = UNICODE_STRING.from_string(name) result = error_on_null(syscall.NtUserThunkedMenuItemInfo( h_menu, # HMENU hMenu -1, # UINT nPosition True, # BOOL fByPosition True, # BOOL fInsert ctypes.byref(mi_info), # LPMENUITEMINFOW lpmii ctypes.byref(item) # PUNICODE_STRING pstrItem )) print(" mi_info->wID = 0x{0:04x}".format(mi_info.wID)) return result
def trigger(h_menu, name, w_id, n_position, f_by_position): mi_info = MENUITEMINFOW() mi_info.cbSize = ctypes.sizeof(MENUITEMINFOW) mi_info.fMask = MIIM_STRING | MIIM_ID mi_info.fType = MFT_STRING mi_info.fState = MFS_ENABLED mi_info.wID = w_id item = UNICODE_STRING.from_string(name) result = error_on_null( syscall.NtUserThunkedMenuItemInfo( h_menu, # HMENU hMenu n_position, # UINT nPosition f_by_position, # BOOL fByPosition True, # BOOL fInsert ctypes.byref(mi_info), # LPMENUITEMINFOW lpmii ctypes.byref(item) # PUNICODE_STRING pstrItem )) return result
def add_menu_item(h_menu, name, w_id=None): mi_info = MENUITEMINFOW() mi_info.cbSize = ctypes.sizeof(MENUITEMINFOW) mi_info.fMask = MIIM_STRING | MIIM_ID mi_info.fType = MFT_STRING mi_info.fState = MFS_ENABLED mi_info.wID = random.randint(0x1000, 0xffff) if w_id is None else w_id item = UNICODE_STRING.from_string(name) result = error_on_null( syscall.NtUserThunkedMenuItemInfo( h_menu, # HMENU hMenu -1, # UINT nPosition True, # BOOL fByPosition True, # BOOL fInsert ctypes.byref(mi_info), # LPMENUITEMINFOW lpmii ctypes.byref(item) # PUNICODE_STRING pstrItem )) print(" mi_info->wID = 0x{0:04x}".format(mi_info.wID)) return result
def add_submenu_item(h_menu, name, w_id=None): h_submenu = user32.CreatePopupMenu() mi_info = MENUITEMINFOW() mi_info.cbSize = ctypes.sizeof(MENUITEMINFOW) mi_info.fMask = MIIM_STRING | MIIM_SUBMENU | MIIM_ID | MIIM_BITMAP mi_info.fState = MFS_ENABLED mi_info.hSubMenu = h_submenu mi_info.wID = random.randint(0x10, 0xff) if w_id is None else w_id mi_info.dwTypeData = name mi_info.hbmpItem = HBMMENU_SYSTEM # (required to set nPosition to 1 in trigger) item = UNICODE_STRING.from_string(name) result = error_on_null(syscall.NtUserThunkedMenuItemInfo( h_menu, # HMENU hMenu 0, # UINT nPosition False, # BOOL fByPosition True, # BOOL fInsert ctypes.byref(mi_info), # LPMENUITEMINFOW lpmii ctypes.byref(item) # PUNICODE_STRING pstrItem )) print("NtUserThunkedMenuItemInfo submenu result: 0x{0:08x}".format(result)) return h_submenu