windows-nt/Source/XPSP1/NT/shell/cpls/poscpl/internal.h
2020-09-26 16:20:57 +08:00

156 lines
4.9 KiB
C

/*
* INTERNAL.H
*
* Point-of-Sale Control Panel Applet
*
* Author: Ervin Peretz
*
* (c) 2001 Microsoft Corporation
*/
#define USE_OVERLAPPED_IO FALSE
typedef struct posDevice {
#define POSCPL_SIG 'CsoP'
DWORD sig;
LIST_ENTRY listEntry;
/*
* Device type, identified by dialog
* id for the device type
* (e.g. IDD_POS_CASHDRAWER_DLG).
*/
DWORD dialogId;
PHIDP_PREPARSED_DATA hidPreparsedData;
HIDD_ATTRIBUTES hidAttrib;
HIDP_CAPS hidCapabilities;
HWND hDlg;
HANDLE hThread;
PUCHAR readBuffer;
PUCHAR writeBuffer;
HANDLE devHandle;
WCHAR pathName[MAX_PATH];
#if USE_OVERLAPPED_IO
OVERLAPPED overlappedReadInfo;
NTSTATUS overlappedReadStatus;
DWORD overlappedReadLen;
HANDLE overlappedReadEvent;
OVERLAPPED overlappedWriteInfo;
NTSTATUS overlappedWriteStatus;
DWORD overlappedWriteLen;
HANDLE overlappedWriteEvent;
#endif
} posDevice;
/*
* These are non-standard vendor usage values and codes
* used by APG Cash Drawer.
*/
#define USAGE_PAGE_CASH_DEVICE 0x0F0
#define USAGE_CASH_DRAWER 0x0F1
#define USAGE_CASH_DRAWER_NUMBER 0x0F2
#define USAGE_CASH_DRAWER_SET 0x0F3
#define USAGE_CASH_DRAWER_STATUS 0x0F4
enum cashDrawerStates {
DRAWER_STATE_OPEN = 1,
DRAWER_STATE_CLOSED_READY = 2,
DRAWER_STATE_CLOSED_CHARGING = 3,
DRAWER_STATE_LOCKED = 4,
};
/*
* List macros -- not defined in winnt.h for some reason.
*/
#define InitializeListHead(ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
#define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead))
#define RemoveHeadList(ListHead) \
(ListHead)->Flink;\
{RemoveEntryList((ListHead)->Flink)}
#define RemoveTailList(ListHead) \
(ListHead)->Blink;\
{RemoveEntryList((ListHead)->Blink)}
#define RemoveEntryList(Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_Flink;\
_EX_Flink = (Entry)->Flink;\
_EX_Blink = (Entry)->Blink;\
_EX_Blink->Flink = _EX_Flink;\
_EX_Flink->Blink = _EX_Blink;\
}
#define InsertTailList(ListHead,Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Blink = _EX_ListHead->Blink;\
(Entry)->Flink = _EX_ListHead;\
(Entry)->Blink = _EX_Blink;\
_EX_Blink->Flink = (Entry);\
_EX_ListHead->Blink = (Entry);\
}
#define InsertHeadList(ListHead,Entry) {\
PLIST_ENTRY _EX_Flink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Flink = _EX_ListHead->Flink;\
(Entry)->Flink = _EX_Flink;\
(Entry)->Blink = _EX_ListHead;\
_EX_Flink->Blink = (Entry);\
_EX_ListHead->Flink = (Entry);\
}
/*
* Function prototypes
*/
VOID LaunchPOSDialog(HWND hwndCPl);
INT_PTR APIENTRY POSDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR APIENTRY NullPOSDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
posDevice *NewPOSDevice(DWORD dialogId, HANDLE devHandle, PWCHAR devPath, PHIDP_PREPARSED_DATA pHidPreparsedData, PHIDD_ATTRIBUTES pHidAttrib, HIDP_CAPS *pHidCapabilities);
VOID DestroyPOSDevice(posDevice *posDev);
VOID EnqueuePOSDevice(posDevice *posDev);
VOID DequeuePOSDevice(posDevice *posDev);
VOID OpenAllHIDPOSDevices();
VOID IntToWChar(WCHAR *buf, DWORD x);
VOID HexToWChar(WCHAR *buf, DWORD x);
ULONG WStrNCpy(WCHAR *dest, const WCHAR *src, ULONG maxWChars);
ULONG AsciiToWChar(WCHAR *dest, const char *src, ULONG maxChars);
posDevice *GetDeviceByHDlg(HWND hDlg);
VOID LaunchDeviceInstanceThread(posDevice *posDev);
DWORD __stdcall DeviceInstanceThread(void *context);
BOOL SetCashDrawerState(posDevice *posDev, enum cashDrawerStates newState);
#if USE_OVERLAPPED_IO
VOID CALLBACK OverlappedReadCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped);
VOID CALLBACK OverlappedWriteCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped);
#endif
/*
* Externs
*/
extern HANDLE g_hInst;
extern ULONG numDeviceInstances;
extern LIST_ENTRY allPOSDevicesList;