📄 windrvr.h
字号:
// even if the device sent less data than requested in dwBytes.
PVOID pBuffer; // Pointer to buffer to read/write.
DWORD dwBytes; // Amount of bytes to transfer.
DWORD dwTimeout; // Timeout for the transfer in milliseconds. Set to 0 for infinite wait.
DWORD dwBytesTransfered; // Returns the number of bytes actually read/written
BYTE SetupPacket[8]; // Setup packet for control pipe transfer.
DWORD fOK; // TRUE if transfer succeeded.
DWORD dwStatus; // Transfer status code - see WD_ERROR_CODES enum definition.
// WD_USBD_STATUS_SUCCESS for a successful transfer.
} WD_USB_TRANSFER, WD_USB_TRANSFER_V52;
typedef struct {
DWORD uniqueId; // The device unique ID.
DWORD dwConfigurationIndex; // The index of the configuration to register.
DWORD dwInterfaceNum; // Interface to register.
DWORD dwInterfaceAlternate;
DWORD hDevice; // Handle of device.
WD_USB_DEVICE_INFO Device; // Description of the device.
DWORD dwOptions; // Should be zero.
CHAR cName[32]; // Name of card.
CHAR cDescription[100]; // Description.
DWORD dwStatus; // Register status code - see WD_ERROR_CODES enum definition.
// WD_USBD_STATUS_SUCCESS for a successful registration.
} WD_USB_DEVICE_REGISTER, WD_USB_DEVICE_REGISTER_V52;
typedef struct
{
DWORD hDevice;
DWORD dwPipe;
DWORD dwStatus; // Reset status code - see WD_ERROR_CODES enum definition.
// WD_USBD_STATUS_SUCCESS for a successful reset.
} WD_USB_RESET_PIPE, WD_USB_RESET_PIPE_V52;
typedef enum
{
WD_INSERT = 0x1,
WD_REMOVE = 0x2,
WD_POWER_CHANGED_D0 = 0x10, //power states for the power management.
WD_POWER_CHANGED_D1 = 0x20,
WD_POWER_CHANGED_D2 = 0x40,
WD_POWER_CHANGED_D3 = 0x80,
WD_POWER_SYSTEM_WORKING = 0x100,
WD_POWER_SYSTEM_SLEEPING1 = 0x200,
WD_POWER_SYSTEM_SLEEPING2 = 0x400,
WD_POWER_SYSTEM_SLEEPING3 = 0x800,
WD_POWER_SYSTEM_HIBERNATE = 0x1000,
WD_POWER_SYSTEM_SHUTDOWN = 0x2000,
} WD_EVENT_ACTION;
typedef enum
{
WD_ACKNOWLEDGE = 0x1,
WD_ACCEPT_CONTROL = 0x2, // used in WD_EVENT_SEND (acknowledge)
} WD_EVENT_OPTION;
#define WD_ACTIONS_POWER (WD_POWER_CHANGED_D0 | WD_POWER_CHANGED_D1 | WD_POWER_CHANGED_D2 | \
WD_POWER_CHANGED_D3 | WD_POWER_SYSTEM_WORKING | WD_POWER_SYSTEM_SLEEPING1 | \
WD_POWER_SYSTEM_SLEEPING3 | WD_POWER_SYSTEM_HIBERNATE | WD_POWER_SYSTEM_SHUTDOWN)
#define WD_ACTIONS_ALL (WD_ACTIONS_POWER | WD_INSERT | WD_REMOVE)
typedef struct
{
DWORD handle;
DWORD dwAction; // WD_EVENT_ACTION
DWORD dwStatus; // EVENT_STATUS
DWORD dwEventId;
DWORD dwCardType; //WD_BUS_PCI or WD_BUS_USB
DWORD hKernelPlugIn;
DWORD dwOptions; // WD_EVENT_OPTION
union
{
struct
{
WD_PCI_ID cardId;
WD_PCI_SLOT pciSlot;
} Pci;
struct
{
WD_USB_ID deviceId;
DWORD dwUniqueID;
} Usb;
} u;
DWORD dwEventVer;
DWORD dwNumMatchTables;
WDU_MATCH_TABLE matchTables[1];
} WD_EVENT, WD_EVENT_V60;
typedef struct
{
DWORD applications_num;
DWORD devices_num;
} WD_USAGE;
enum { WD_USB_HARD_RESET = 1 };
typedef struct
{
DWORD hDevice;
DWORD dwOptions; // USB_RESET options:
// WD_USB_HARD_RESET - will reset the device
// even if it is not disabled.
// After using this option it is advised to
// un-register the device (WD_UsbDeviceUnregister())
// and register it again - to make sure that the
// device has all its resources.
DWORD dwStatus; // Reset status code - see WD_ERROR_CODES enum definition.
// WD_USBD_STATUS_SUCCESS for a successful reset.
} WD_USB_RESET_DEVICE, WD_USB_RESET_DEVICE_V52;
#define WD_KERNEL_DRIVER_PLUGIN_HANDLE 0xffff0000
#ifndef BZERO
#define BZERO(buf) memset(&(buf), 0, sizeof(buf))
#endif
#ifndef INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE ((HANDLE)(-1))
#endif
#ifndef CTL_CODE
#define CTL_CODE(DeviceType, Function, Method, Access) ( \
((DeviceType)<<16) | ((Access)<<14) | ((Function)<<2) | (Method) \
)
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS 1 // file & pipe
#define FILE_WRITE_ACCESS 2 // file & pipe
#endif
#if defined(UNIX)
#define WD_CTL_CODE(wFuncNum) wFuncNum
#else
// Device type
#define WD_TYPE 38200
#define WD_CTL_CODE(wFuncNum) ((DWORD) CTL_CODE( WD_TYPE, wFuncNum, METHOD_NEITHER, FILE_ANY_ACCESS))
#endif
// WinDriver function IOCTL calls. For details on the WinDriver functions,
// see the WinDriver manual or included help files.
#define IOCTL_WD_DMA_LOCK WD_CTL_CODE(0x901)
#define IOCTL_WD_DMA_UNLOCK WD_CTL_CODE(0x902)
#define IOCTL_WD_TRANSFER WD_CTL_CODE(0x903)
#define IOCTL_WD_MULTI_TRANSFER WD_CTL_CODE(0x904)
#define IOCTL_WD_PCI_SCAN_CARDS WD_CTL_CODE(0x90e)
#define IOCTL_WD_PCI_GET_CARD_INFO WD_CTL_CODE(0x90f)
#define IOCTL_WD_VERSION WD_CTL_CODE(0x910)
#define IOCTL_WD_PCI_CONFIG_DUMP WD_CTL_CODE(0x91a)
#define IOCTL_WD_KERNEL_PLUGIN_OPEN WD_CTL_CODE(0x91b)
#define IOCTL_WD_KERNEL_PLUGIN_CLOSE WD_CTL_CODE(0x91c)
#define IOCTL_WD_KERNEL_PLUGIN_CALL WD_CTL_CODE(0x91d)
#define IOCTL_WD_INT_ENABLE WD_CTL_CODE(0x91e)
#define IOCTL_WD_INT_DISABLE WD_CTL_CODE(0x91f)
#define IOCTL_WD_INT_COUNT WD_CTL_CODE(0x920)
#define IOCTL_WD_ISAPNP_SCAN_CARDS WD_CTL_CODE(0x924)
#define IOCTL_WD_ISAPNP_CONFIG_DUMP WD_CTL_CODE(0x926)
#define IOCTL_WD_SLEEP WD_CTL_CODE(0x927)
#define IOCTL_WD_DEBUG WD_CTL_CODE(0x928)
#define IOCTL_WD_DEBUG_DUMP WD_CTL_CODE(0x929)
#define IOCTL_WD_CARD_UNREGISTER WD_CTL_CODE(0x92b)
#define IOCTL_WD_ISAPNP_GET_CARD_INFO WD_CTL_CODE(0x92d)
#define IOCTL_WD_PCMCIA_SCAN_CARDS WD_CTL_CODE(0x92f)
#define IOCTL_WD_PCMCIA_GET_CARD_INFO WD_CTL_CODE(0x930)
#define IOCTL_WD_PCMCIA_CONFIG_DUMP WD_CTL_CODE(0x931)
#define IOCTL_WD_CARD_REGISTER WD_CTL_CODE(0x97d)
#define IOCTL_WD_INT_WAIT WD_CTL_CODE(0x94b)
#define IOCTL_WD_LICENSE WD_CTL_CODE(0x952)
#define IOCTL_WD_USB_RESET_PIPE WD_CTL_CODE(0x971)
#define IOCTL_WD_USB_RESET_DEVICE WD_CTL_CODE(0x93f)
#define IOCTL_WD_USB_SCAN_DEVICES WD_CTL_CODE(0x969)
#define IOCTL_WD_USB_TRANSFER WD_CTL_CODE(0x967)
#define IOCTL_WD_USB_DEVICE_REGISTER WD_CTL_CODE(0x968)
#define IOCTL_WD_USB_DEVICE_UNREGISTER WD_CTL_CODE(0x970)
#define IOCTL_WD_USB_GET_CONFIGURATION WD_CTL_CODE(0x974)
#define IOCTL_WD_EVENT_REGISTER WD_CTL_CODE(0x986)
#define IOCTL_WD_EVENT_UNREGISTER WD_CTL_CODE(0x987)
#define IOCTL_WD_EVENT_PULL WD_CTL_CODE(0x988)
#define IOCTL_WD_EVENT_SEND WD_CTL_CODE(0x989)
#define IOCTL_WD_DEBUG_ADD WD_CTL_CODE(0x964)
#define IOCTL_WD_USB_RESET_DEVICEEX WD_CTL_CODE(0x973)
#define IOCTL_WD_USAGE WD_CTL_CODE(0x976)
#define IOCTL_WDU_GET_DEVICE_DATA WD_CTL_CODE(0x980)
#define IOCTL_WDU_SET_INTERFACE WD_CTL_CODE(0x981)
#define IOCTL_WDU_RESET_PIPE WD_CTL_CODE(0x982)
#define IOCTL_WDU_TRANSFER WD_CTL_CODE(0x983)
#define IOCTL_WDU_HALT_TRANSFER WD_CTL_CODE(0x985)
#if defined(UNIX)
typedef struct
{
DWORD dwHeader;
PVOID pData;
DWORD dwSize;
} WD_IOCTL_HEADER;
enum { WD_IOCTL_HEADER_CODE = 0xa410b413 };
#endif
#if defined(__KERNEL__)
HANDLE __cdecl WD_Open();
void __cdecl WD_Close(HANDLE hWD);
DWORD __cdecl KP_DeviceIoControl(DWORD dwFuncNum, HANDLE h, PVOID pParam,
DWORD dwSize);
#define WD_FUNCTION(wFuncNum, h, pParam, dwSize, fWait) \
KP_DeviceIoControl(\
(DWORD) wFuncNum, h,\
(PVOID) pParam, (DWORD) dwSize\
)
#else
#if defined(UNIX)
static inline ULONG WD_FUNCTION_LOCAL( DWORD wFuncNum, HANDLE h,
PVOID pParam, DWORD dwSize, BOOL fWait)
{
WD_IOCTL_HEADER ioctl_hdr;
ioctl_hdr.dwHeader = WD_IOCTL_HEADER_CODE;
ioctl_hdr.pData = pParam;
ioctl_hdr.dwSize = dwSize;
#if defined(VXWORKS)
return (ULONG) ioctl((int)(h), wFuncNum, (int)&ioctl_hdr);
#elif defined(LINUX) || defined(SOLARIS)
return (ULONG) ioctl((int)(DWORD)(h), wFuncNum, &ioctl_hdr);
#endif
}
#if defined(VXWORKS)
#define WD_OpenLocal()\
((HANDLE)open("/windrvr6", O_RDWR, 0644))
#else
#define WD_OpenLocal()\
((HANDLE)(DWORD)open("/dev/windrvr6", O_RDWR))
#endif
#define WD_CloseLocal(h)\
close((int)(DWORD)(h))
#elif defined(WINCE) && defined(_WIN32_WCE_EMULATION)
HANDLE WINAPI WCE_EMU_WD_Open();
void WINAPI WCE_EMU_WD_Close(HANDLE hWD);
BOOL WINAPI WCE_EMU_WD_FUNCTION(DWORD wFuncNum, HANDLE h, PVOID
pParam, DWORD dwSize);
#define WD_OpenLocal() WCE_EMU_WD_Open()
#define WD_CloseLocal(h) WCE_EMU_WD_Close(h)
#define WD_FUNCTION_LOCAL(wFuncNum, h, pParam, dwSize, fWait) \
WCE_EMU_WD_FUNCTION(wFuncNum, h, pParam, dwSize)
#elif defined(WIN32) || defined(WINCE)
#define WD_CloseLocal(h)\
CloseHandle(h)
#if defined(WINCE)
void WINAPI SetProcPermissions(DWORD dwPermissions);
#define WD_OpenLocal()\
(SetProcPermissions(0xFFFF), CreateFile(\
TEXT("WDR1:"),\
GENERIC_READ,\
FILE_SHARE_READ | FILE_SHARE_WRITE,\
NULL, OPEN_EXISTING, 0, NULL))
static DWORD WD_FUNCTION_LOCAL(DWORD wFuncNum, HANDLE h,
PVOID pParam, DWORD dwSize, BOOL fWait)
{
DWORD dwTmp;
DWORD rc = (DWORD)WD_STATUS_INVALID_WD_HANDLE;
((DWORD) DeviceIoControl(h, wFuncNum, pParam, dwSize, &rc, sizeof(DWORD),
&dwTmp, NULL));
return rc;
}
#elif defined(WIN32)
#define WD_OpenLocal()\
CreateFile(\
TEXT("\\\\.\\WINDRVR6"),\
GENERIC_READ,\
FILE_SHARE_READ | FILE_SHARE_WRITE,\
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL)
static DWORD WD_FUNCTION_LOCAL(DWORD wFuncNum, HANDLE h,
PVOID pParam, DWORD dwSize, BOOL fWait)
{
DWORD dwTmp;
HANDLE hWD = fWait ? WD_OpenLocal() : h;
DWORD rc = (DWORD)WD_STATUS_INVALID_WD_HANDLE;
if (hWD==INVALID_HANDLE_VALUE)
return (DWORD) -1;
DeviceIoControl(hWD, (DWORD) wFuncNum, (PVOID) pParam,
(DWORD) dwSize, &rc, sizeof(DWORD), &dwTmp, NULL);
if (fWait)
WD_CloseLocal(hWD);
return rc;
}
#endif
#endif
#define WD_FUNCTION WD_FUNCTION_LOCAL
#define WD_Close WD_CloseLocal
#define WD_Open WD_OpenLocal
#endif
#define WD_Debug(h,pDebug)\
WD_FUNCTION(IOCTL_WD_DEBUG, h, pDebug, sizeof (WD_DEBUG), FALSE)
#define WD_DebugDump(h,pDebugDump)\
WD_FUNCTION(IOCTL_WD_DEBUG_DUMP, h, pDebugDump, sizeof (WD_DEBUG_DUMP), FALSE)
#define WD_DebugAdd(h, pDebugAdd)\
WD_FUNCTION(IOCTL_WD_DEBUG_ADD, h, pDebugAdd, sizeof(WD_DEBUG_ADD), FALSE)
#define WD_Transfer(h,pTransfer)\
WD_FUNCTION(IOCTL_WD_TRANSFER, h, pTransfer, sizeof (WD_TRANSFER), FALSE)
#define WD_MultiTransfer(h,pTransferArray,dwNumTransfers)\
WD_FUNCTION(IOCTL_WD_MULTI_TRANSFER, h, pTransferArray, sizeof (WD_TRANSFER) * (dwNumTransfers), FALSE)
#define WD_DMALock(h,pDma)\
WD_FUNCTION(IOCTL_WD_DMA_LOCK, h, pDma, sizeof (WD_DMA), FALSE)
#define WD_DMAUnlock(h,pDma)\
WD_FUNCTION(IOCTL_WD_DMA_UNLOCK, h, pDma, sizeof (WD_DMA), FALSE)
#define WD_CardRegister(h,pCard)\
WD_FUNCTION(IOCTL_WD_CARD_REGISTER, h, pCard, sizeof (WD_CARD_REGISTER), FALSE)
#define WD_CardUnregister(h,pCard)\
WD_FUNCTION(IOCTL_WD_CARD_UNREGISTER, h, pCard, sizeof (WD_CARD_REGISTER), FALSE)
#define WD_PciScanCards(h,pPciScan)\
WD_FUNCTION(IOCTL_WD_PCI_SCAN_CARDS, h, pPciScan, sizeof (WD_PCI_SCAN_CARDS), FALSE)
#define WD_PciGetCardInfo(h,pPciCard)\
WD_FUNCTION(IOCTL_WD_PCI_GET_CARD_INFO, h, pPciCard, sizeof (WD_PCI_CARD_INFO), FALSE)
#define WD_PciConfigDump(h,pPciConfigDump)\
WD_FUNCTION(IOCTL_WD_PCI_CONFIG_DUMP, h, pPciConfigDump, sizeof (WD_PCI_CONFIG_DUMP), FALSE)
#define WD_Version(h,pVerInfo)\
WD_FUNCTION(IOCTL_WD_VERSION, h, pVerInfo, sizeof (WD_VERSION), FALSE)
#define WD_License(h,pLicense)\
WD_FUNCTION(IOCTL_WD_LICENSE, h, pLicense, sizeof (WD_LICENSE), FALSE)
#define WD_KernelPlugInOpen(h,pKernelPlugIn)\
WD_FUNCTION(IOCTL_WD_KERNEL_PLUGIN_OPEN, h, pKernelPlugIn, sizeof (WD_KERNEL_PLUGIN), FALSE)
#define WD_KernelPlugInClose(h,pKernelPlugIn)\
WD_FUNCTION(IOCTL_WD_KERNEL_PLUGIN_CLOSE, h, pKernelPlugIn, sizeof (WD_KERNEL_PLUGIN), FALSE)
#define WD_KernelPlugInCall(h,pKernelPlugInCall)\
WD_FUNCTION(IOCTL_WD_KERNEL_PLUGIN_CALL, h, pKernelPlugInCall, sizeof (WD_KERNEL_PLUGIN_CALL), FALSE)
#define WD_IntEnable(h,pInterrupt)\
WD_FUNCTION(IOCTL_WD_INT_ENABLE, h, pInterrupt, sizeof (WD_INTERRUPT), FALSE)
#define WD_IntDisable(h,pInterrupt)\
WD_FUNCTION(IOCTL_WD_INT_DISABLE, h, pInterrupt, sizeof (WD_INTERRUPT), FALSE)
#define WD_IntCount(h,pInterrupt)\
WD_FUNCTION(IOCTL_WD_INT_COUNT, h, pInterrupt, sizeof (WD_INTERRUPT), FALSE)
#define WD_IntWait(h,pInterrupt)\
WD_FUNCTION(IOCTL_WD_INT_WAIT, h, pInterrupt, sizeof (WD_INTERRUPT), TRUE)
#define WD_IsapnpScanCards(h,pIsapnpScan)\
WD_FUNCTION(IOCTL_WD_ISAPNP_SCAN_CARDS, h, pIsapnpScan, sizeof (WD_ISAPNP_SCAN_CARDS), FALSE)
#define WD_IsapnpGetCardInfo(h,pIsapnpCard)\
WD_FUNCTION(IOCTL_WD_ISAPNP_GET_CARD_INFO, h, pIsapnpCard, sizeof (WD_ISAPNP_CARD_INFO), FALSE)
#define WD_IsapnpConfigDump(h,pIsapnpConfigDump)\
WD_FUNCTION(IOCTL_WD_ISAPNP_CONFIG_DUMP, h, pIsapnpConfigDump, sizeof (WD_ISAPNP_CONFIG_DUMP), FALSE)
#define WD_PcmciaScanCards(h,pPcmciaScan)\
WD_FUNCTION(IOCTL_WD_PCMCIA_SCAN_CARDS, h, pPcmciaScan, sizeof (WD_PCMCIA_SCAN_CARDS), FALSE)
#define WD_PcmciaGetCardInfo(h,pPcmciaCard)\
WD_FUNCTION(IOCTL_WD_PCMCIA_GET_CARD_INFO, h, pPcmciaCard, sizeof (WD_PCMCIA_CARD_INFO), FALSE)
#define WD_PcmciaConfigDump(h,pPcmciaConfigDump)\
WD_FUNCTION(IOCTL_WD_PCMCIA_CONFIG_DUMP, h, pPcmciaConfigDump, sizeof (WD_PCMCIA_CONFIG_DUMP), FALSE)
#define WD_Sleep(h,pSleep)\
WD_FUNCTION(IOCTL_WD_SLEEP, h, pSleep, sizeof (WD_SLEEP), FALSE)
#define WD_UsbScanDevice(h, pScan)\
WD_FUNCTION(IOCTL_WD_USB_SCAN_DEVICES, h, pScan,sizeof(WD_USB_SCAN_DEVICES), FALSE)
#define WD_UsbGetConfiguration(h, pConfig) \
WD_FUNCTION(IOCTL_WD_USB_GET_CONFIGURATION, h, pConfig, sizeof(WD_USB_CONFIGURATION), FALSE)
#define WD_UsbDeviceRegister(h, pRegister)\
WD_FUNCTION(IOCTL_WD_USB_DEVICE_REGISTER, h, pRegister, sizeof(WD_USB_DEVICE_REGISTER), FALSE)
#define WD_UsbTransfer(h, pTrans)\
WD_FUNCTION(IOCTL_WD_USB_TRANSFER, h, pTrans, sizeof(WD_USB_TRANSFER), TRUE)
#define WD_UsbDeviceUnregister(h, pRegister)\
WD_FUNCTION(IOCTL_WD_USB_DEVICE_UNREGISTER, h, pRegister, sizeof(WD_USB_DEVICE_REGISTER), FALSE)
#define WD_UsbResetPipe(h, pResetPipe)\
WD_FUNCTION(IOCTL_WD_USB_RESET_PIPE, h, pResetPipe, sizeof(WD_USB_RESET_PIPE), FALSE)
#define WD_UsbResetDevice(h, hDevice)\
WD_FUNCTION(IOCTL_WD_USB_RESET_DEVICE, h, &hDevice, sizeof(DWORD), FALSE)
#define WD_EventRegister(h, pEvent) \
WD_FUNCTION(IOCTL_WD_EVENT_REGISTER, h, pEvent, sizeof(WD_EVENT), FALSE)
#define WD_EventUnregister(h, pEvent) \
WD_FUNCTION(IOCTL_WD_EVENT_UNREGISTER, h, pEvent, sizeof(WD_EVENT), FALSE)
#define WD_EventPull(h,pEvent) \
WD_FUNCTION(IOCTL_WD_EVENT_PULL, h, pEvent, sizeof(WD_EVENT), FALSE)
#define WD_EventSend(h,pEvent) \
WD_FUNCTION(IOCTL_WD_EVENT_SEND, h, pEvent, sizeof(WD_EVENT), FALSE)
#define WD_UsbResetDeviceEx(h, pReset)\
WD_FUNCTION(IOCTL_WD_USB_RESET_DEVICEEX, h, pReset, sizeof(WD_USB_RESET_DEVICE), FALSE)
#define WD_Usage(h, pStop) \
WD_FUNCTION(IOCTL_WD_USAGE, h, pStop, sizeof(WD_USAGE), FALSE)
#define WD_UGetDeviceData(h, pGetDevData) \
WD_FUNCTION(IOCTL_WDU_GET_DEVICE_DATA, h, pGetDevData, sizeof(WDU_GET_DEVICE_DATA), FALSE);
#define WD_USetInterface(h, pSetIfc) \
WD_FUNCTION(IOCTL_WDU_SET_INTERFACE, h, pSetIfc, sizeof(WDU_SET_INTERFACE), FALSE);
#define WD_UResetPipe(h, pResetPipe) \
WD_FUNCTION(IOCTL_WDU_RESET_PIPE, h, pResetPipe, sizeof(WDU_RESET_PIPE), FALSE);
#define WD_UTransfer(h, pTrans) \
WD_FUNCTION(IOCTL_WDU_TRANSFER, h, pTrans, sizeof(WDU_TRANSFER), TRUE);
#define WD_UHaltTransfer(h, pHaltTrans) \
WD_FUNCTION(IOCTL_WDU_HALT_TRANSFER, h, pHaltTrans, sizeof(WDU_HALT_TRANSFER), FALSE);
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -