Python Code
Below is the Python code snippet to block USB ports:
import ctypes
CTL_CODE = 0x00000022
FILE_DEVICE_UNKNOWN = 0x00000022
METHOD_BUFFERED = 0
FILE_ANY_ACCESS = 0
class DWORD(ctypes.c_ulong):
pass
class OVERLAPPED(ctypes.Structure):
_fields_ = [("Internal", ctypes.c_ulong),
("InternalHigh", ctypes.c_ulong),
("Offset", DWORD),
("OffsetHigh", DWORD),
("Pointer", ctypes.c_void_p),
("hEvent", ctypes.c_void_p)]
class USB_Hub_Name(ctypes.Structure):
_fields_ = [("RootHubName", ctypes.c_wchar_p)]
kernel32 = ctypes.windll.kernel32
setupapi = ctypes.windll.setupapi
advapi32 = ctypes.windll.advapi32
def change_usb_state(enable):
h = kernel32.CreateFileW("\\\\.\\HCD1", 0xC0000000, 3, None, 3, 0, None)
ioctl = ctypes.c_ulong()
driver = ctypes.c_ulong()
driver.value = 0
if enable:
status = ctypes.c_int()
status.value = 1
ctypes.windll.kernel32.DeviceIoControl(h, CTL_CODE, ctypes.byref(ioctl), 1, None, 0, ctypes.byref(driver), None)
if __name__ == "__main__":
while True:
choice = input("Enter 1 to Activate USB ports or 0 to Deactivate USB ports (q to quit): ")
if choice.lower() == 'q':
break
try:
choice = int(choice)
if choice == 1:
change_usb_state(True)
print("USB ports activated.")
elif choice == 0:
change_usb_state(False)
print("USB ports deactivated.")
else:
print("Invalid choice. Please enter 1 or 0.")
except ValueError:
print("Invalid input. Please enter a valid number (1 or 0).")
Explanation:
- Importing ctypes:
ctypesis a Python library for interacting with C-style data structures and functions in DLLs. - Constants: Several constants (
CTL_CODE,FILE_DEVICE_UNKNOWN,METHOD_BUFFERED,FILE_ANY_ACCESS) are defined for IOCTL (Input/Output Control) operations on Windows devices. - Data Types:
DWORD: Defined as a subclass ofctypes.c_ulongfor handling 32-bit unsigned integers.OVERLAPPED: Represents a structure (ctypes.Structure) used in overlapped I/O operations, defining fields likeInternal,Offset, etc.USB_Hub_Name: Represents a structure for USB Hub Name, with a single fieldRootHubName.
- DLL Loading:
kernel32,setupapi, andadvapi32are loaded usingctypes.windllto access functions from respective Windows DLLs (kernel32.dll,setupapi.dll,advapi32.dll).
change_usb_statefunction:- Opens a handle (
h) to the USB device ("\\\\.\\HCD1"). - Uses
DeviceIoControlfunction fromkernel32.dllto perform an IOCTL operation (CTL_CODE) on the USB device, enabling or disabling USB ports based on theenableparameter.
- Opens a handle (
- Main Program Execution:
- Enters a loop (
while True) to interactively prompt the user (input) to activate (1) or deactivate (0) USB ports, or quit ('q'). - Handles user input, calling
change_usb_stateaccordingly and providing feedback (print) based on the action performed.
- Enters a loop (
This code snippet demonstrates how to control USB port states programmatically using Python on Windows, leveraging low-level system calls (ctypes and Windows API functions) typically used for device management tasks.