mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-21 05:43:23 -07:00
Initial commit for the firmware. Used the 20090306_ela version as baseline.
It is identical to the popular 20081211, with the doob addition (20090301), a linux client, and two additional commands for LF analysis. Let me know if you find issues here!
This commit is contained in:
parent
b811cc51f9
commit
6658905f18
91 changed files with 16661 additions and 0 deletions
31
winsrc/Makefile
Normal file
31
winsrc/Makefile
Normal file
|
@ -0,0 +1,31 @@
|
|||
BASE_DEFS = /D_WIN32_WINNT=0x501 /DISOLATION_AWARE_ENABLED /D_WIN32_IE=0x600 /DWIN32_LEAN_AND_MEAN /DWIN32 /D_MT /D_CRT_SECURE_NO_WARNINGS
|
||||
BASE_CFLAGS = /W3 /nologo
|
||||
|
||||
DEFINES = $(BASE_DEFS)
|
||||
CFLAGS = $(BASE_CFLAGS) /Zi /MT
|
||||
|
||||
OBJDIR = obj
|
||||
|
||||
OBJS = $(OBJDIR)\prox.obj \
|
||||
$(OBJDIR)\gui.obj \
|
||||
$(OBJDIR)\command.obj
|
||||
|
||||
LIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setupapi.lib
|
||||
|
||||
HEADERS = prox.h
|
||||
|
||||
all: $(OBJDIR)/prox.exe
|
||||
copy $(OBJDIR)\prox.exe .
|
||||
|
||||
clean:
|
||||
del /q obj\*.obj
|
||||
del /q obj\*.ilk
|
||||
del /q obj\*.exe
|
||||
del /q obj\*.pdb
|
||||
del /q *.pdb
|
||||
|
||||
$(OBJDIR)/prox.exe: $(OBJS)
|
||||
$(CC) $(DEFINES) $(CFLAGS) -Fe$(OBJDIR)/prox.exe $(OBJS) $(LIBS)
|
||||
|
||||
$(OBJS): $(@B).cpp $(HEADERS)
|
||||
$(CC) $(CFLAGS) $(DEFINES) -c -Fo$(OBJDIR)/$(@B).obj $(@B).cpp
|
1812
winsrc/command.cpp
Normal file
1812
winsrc/command.cpp
Normal file
File diff suppressed because it is too large
Load diff
510
winsrc/gui.cpp
Normal file
510
winsrc/gui.cpp
Normal file
|
@ -0,0 +1,510 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// Routines for the user interface when doing interactive things with prox
|
||||
// cards; this is basically a command line thing, in one window, and then
|
||||
// another window to do the graphs.
|
||||
// Jonathan Westhues, Sept 2005
|
||||
//-----------------------------------------------------------------------------
|
||||
#include <windows.h>
|
||||
#include <limits.h>
|
||||
#include <commctrl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "prox.h"
|
||||
|
||||
#define oops() do { \
|
||||
char line[100]; \
|
||||
sprintf(line, "Internal error at line %d file '%s'", __LINE__, \
|
||||
__FILE__); \
|
||||
MessageBox(NULL, line, "Error", MB_ICONERROR); \
|
||||
exit(-1); \
|
||||
} while(0)
|
||||
|
||||
void dbp(char *str, ...)
|
||||
{
|
||||
va_list f;
|
||||
char buf[1024];
|
||||
va_start(f, str);
|
||||
vsprintf(buf, str, f);
|
||||
OutputDebugString(buf);
|
||||
OutputDebugString("\n");
|
||||
}
|
||||
|
||||
int GraphBuffer[MAX_GRAPH_TRACE_LEN];
|
||||
int GraphTraceLen;
|
||||
|
||||
HPEN GreyPen, GreenPen, WhitePen, YellowPen;
|
||||
HBRUSH GreenBrush, YellowBrush;
|
||||
|
||||
static int GraphStart = 0;
|
||||
static double GraphPixelsPerPoint = 1;
|
||||
|
||||
static int CursorAPos;
|
||||
static int CursorBPos;
|
||||
double CursorScaleFactor = 1.0;
|
||||
static HPEN CursorAPen;
|
||||
static HPEN CursorBPen;
|
||||
|
||||
static HWND CommandWindow;
|
||||
static HWND GraphWindow;
|
||||
static HWND ScrollbackEdit;
|
||||
static HWND CommandEdit;
|
||||
|
||||
#define COMMAND_HISTORY_MAX 16
|
||||
static char CommandHistory[COMMAND_HISTORY_MAX][256];
|
||||
static int CommandHistoryPos = -1;
|
||||
static int CommandHistoryNext;
|
||||
|
||||
static HFONT MyFixedFont;
|
||||
#define FixedFont(x) SendMessage((x), WM_SETFONT, (WPARAM)MyFixedFont, TRUE)
|
||||
|
||||
void ExecCmd(char *cmd)
|
||||
{
|
||||
|
||||
}
|
||||
int CommandFinished;
|
||||
|
||||
static void ResizeCommandWindow(void)
|
||||
{
|
||||
int w, h;
|
||||
RECT r;
|
||||
GetClientRect(CommandWindow, &r);
|
||||
w = r.right - r.left;
|
||||
h = r.bottom - r.top;
|
||||
MoveWindow(ScrollbackEdit, 10, 10, w - 20, h - 50, TRUE);
|
||||
MoveWindow(CommandEdit, 10, h - 29, w - 20, 22, TRUE);
|
||||
}
|
||||
|
||||
void RepaintGraphWindow(void)
|
||||
{
|
||||
InvalidateRect(GraphWindow, NULL, TRUE);
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK
|
||||
CommandWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (msg) {
|
||||
case WM_DESTROY:
|
||||
case WM_QUIT:
|
||||
exit(0);
|
||||
return 0;
|
||||
|
||||
case WM_SIZE:
|
||||
ResizeCommandWindow();
|
||||
return 0;
|
||||
|
||||
case WM_SETFOCUS:
|
||||
SetFocus(CommandEdit);
|
||||
break;
|
||||
|
||||
default:
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void PaintGraph(HDC hdc)
|
||||
{
|
||||
HBRUSH brush;
|
||||
HPEN pen;
|
||||
|
||||
brush = GreenBrush;
|
||||
pen = GreenPen;
|
||||
|
||||
if(GraphStart < 0) {
|
||||
GraphStart = 0;
|
||||
}
|
||||
|
||||
RECT r;
|
||||
GetClientRect(GraphWindow, &r);
|
||||
|
||||
SelectObject(hdc, WhitePen);
|
||||
|
||||
MoveToEx(hdc, r.left + 40, r.top, NULL);
|
||||
LineTo(hdc, r.left + 40, r.bottom);
|
||||
|
||||
int zeroHeight = r.top + (r.bottom - r.top) / 2;
|
||||
SelectObject(hdc, GreyPen);
|
||||
MoveToEx(hdc, r.left, zeroHeight, NULL);
|
||||
LineTo(hdc, r.right, zeroHeight);
|
||||
|
||||
int startMax =
|
||||
(GraphTraceLen - (int)((r.right - r.left - 40) / GraphPixelsPerPoint));
|
||||
if(startMax < 0) {
|
||||
startMax = 0;
|
||||
}
|
||||
if(GraphStart > startMax) {
|
||||
GraphStart = startMax;
|
||||
}
|
||||
|
||||
int absYMax = 1;
|
||||
|
||||
SelectObject(hdc, pen);
|
||||
|
||||
int i;
|
||||
for(i = GraphStart; ; i++) {
|
||||
if(i >= GraphTraceLen) {
|
||||
break;
|
||||
}
|
||||
if(fabs((double)GraphBuffer[i]) > absYMax) {
|
||||
absYMax = (int)fabs((double)GraphBuffer[i]);
|
||||
}
|
||||
int x = 40 + (int)((i - GraphStart)*GraphPixelsPerPoint);
|
||||
if(x > r.right) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
absYMax = (int)(absYMax*1.2 + 1);
|
||||
SelectObject(hdc, MyFixedFont);
|
||||
SetTextColor(hdc, RGB(255, 255, 255));
|
||||
SetBkColor(hdc, RGB(0, 0, 0));
|
||||
|
||||
// number of points that will be plotted
|
||||
int span = (int)((r.right - r.left) / GraphPixelsPerPoint);
|
||||
// one label every 100 pixels, let us say
|
||||
int labels = (r.right - r.left - 40) / 100;
|
||||
if(labels <= 0) labels = 1;
|
||||
int pointsPerLabel = span / labels;
|
||||
if(pointsPerLabel <= 0) pointsPerLabel = 1;
|
||||
|
||||
int yMin = INT_MAX;
|
||||
int yMax = INT_MIN;
|
||||
int yMean = 0;
|
||||
int n = 0;
|
||||
|
||||
for(i = GraphStart; ; i++) {
|
||||
if(i >= GraphTraceLen) {
|
||||
break;
|
||||
}
|
||||
int x = 40 + (int)((i - GraphStart)*GraphPixelsPerPoint);
|
||||
if(x > r.right + GraphPixelsPerPoint) {
|
||||
break;
|
||||
}
|
||||
|
||||
int y = GraphBuffer[i];
|
||||
if(y < yMin) {
|
||||
yMin = y;
|
||||
}
|
||||
if(y > yMax) {
|
||||
yMax = y;
|
||||
}
|
||||
yMean += y;
|
||||
n++;
|
||||
|
||||
y = (y * (r.top - r.bottom) / (2*absYMax)) + zeroHeight;
|
||||
if(i == GraphStart) {
|
||||
MoveToEx(hdc, x, y, NULL);
|
||||
} else {
|
||||
LineTo(hdc, x, y);
|
||||
}
|
||||
|
||||
if(GraphPixelsPerPoint > 10) {
|
||||
RECT f;
|
||||
f.left = x - 3;
|
||||
f.top = y - 3;
|
||||
f.right = x + 3;
|
||||
f.bottom = y + 3;
|
||||
FillRect(hdc, &f, brush);
|
||||
}
|
||||
|
||||
if(((i - GraphStart) % pointsPerLabel == 0) && i != GraphStart) {
|
||||
SelectObject(hdc, WhitePen);
|
||||
MoveToEx(hdc, x, zeroHeight - 3, NULL);
|
||||
LineTo(hdc, x, zeroHeight + 3);
|
||||
|
||||
char str[100];
|
||||
sprintf(str, "+%d", (i - GraphStart));
|
||||
SIZE size;
|
||||
GetTextExtentPoint32(hdc, str, strlen(str), &size);
|
||||
TextOut(hdc, x - size.cx, zeroHeight + 8, str, strlen(str));
|
||||
|
||||
SelectObject(hdc, pen);
|
||||
MoveToEx(hdc, x, y, NULL);
|
||||
}
|
||||
|
||||
if(i == CursorAPos || i == CursorBPos) {
|
||||
if(i == CursorAPos) {
|
||||
SelectObject(hdc, CursorAPen);
|
||||
} else {
|
||||
SelectObject(hdc, CursorBPen);
|
||||
}
|
||||
MoveToEx(hdc, x, r.top, NULL);
|
||||
LineTo(hdc, x, r.bottom);
|
||||
|
||||
SelectObject(hdc, pen);
|
||||
MoveToEx(hdc, x, y, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if(n != 0) {
|
||||
yMean /= n;
|
||||
}
|
||||
|
||||
char str[100];
|
||||
sprintf(str, "@%d max=%d min=%d mean=%d n=%d/%d dt=%d [%.3f]",
|
||||
GraphStart, yMax, yMin, yMean, n, GraphTraceLen,
|
||||
CursorBPos - CursorAPos, (CursorBPos - CursorAPos)/CursorScaleFactor);
|
||||
TextOut(hdc, 50, r.bottom - 20, str, strlen(str));
|
||||
}
|
||||
|
||||
static LRESULT CALLBACK
|
||||
GraphWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (msg) {
|
||||
case WM_DESTROY:
|
||||
case WM_QUIT:
|
||||
GraphWindow = NULL;
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
|
||||
case WM_SIZE:
|
||||
RepaintGraphWindow();
|
||||
return 0;
|
||||
|
||||
case WM_PAINT: {
|
||||
PAINTSTRUCT ps;
|
||||
HDC hdc = BeginPaint(hwnd, &ps);
|
||||
if(GraphStart < 0) {
|
||||
GraphStart = 0;
|
||||
}
|
||||
// This draws the trace.
|
||||
PaintGraph(hdc);
|
||||
EndPaint(hwnd, &ps);
|
||||
break;
|
||||
}
|
||||
case WM_KEYDOWN:
|
||||
switch(wParam) {
|
||||
case VK_DOWN:
|
||||
if(GraphPixelsPerPoint <= 50) {
|
||||
GraphPixelsPerPoint *= 2;
|
||||
}
|
||||
break;
|
||||
|
||||
case VK_UP:
|
||||
if(GraphPixelsPerPoint >= 0.02) {
|
||||
GraphPixelsPerPoint /= 2;
|
||||
}
|
||||
break;
|
||||
|
||||
case VK_RIGHT:
|
||||
if(GraphPixelsPerPoint < 20) {
|
||||
GraphStart += (int)(20 / GraphPixelsPerPoint);
|
||||
} else {
|
||||
GraphStart++;
|
||||
}
|
||||
break;
|
||||
|
||||
case VK_LEFT:
|
||||
if(GraphPixelsPerPoint < 20) {
|
||||
GraphStart -= (int)(20 / GraphPixelsPerPoint);
|
||||
} else {
|
||||
GraphStart--;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
goto nopaint;
|
||||
}
|
||||
RepaintGraphWindow();
|
||||
nopaint:
|
||||
break;
|
||||
|
||||
case WM_LBUTTONDOWN:
|
||||
case WM_RBUTTONDOWN: {
|
||||
int x = LOWORD(lParam);
|
||||
x -= 40;
|
||||
x = (int)(x / GraphPixelsPerPoint);
|
||||
x += GraphStart;
|
||||
if(msg == WM_LBUTTONDOWN) {
|
||||
CursorAPos = x;
|
||||
} else {
|
||||
CursorBPos = x;
|
||||
}
|
||||
RepaintGraphWindow();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void PrintToScrollback(char *fmt, ...)
|
||||
{
|
||||
va_list f;
|
||||
char str[1024];
|
||||
strcpy(str, "\r\n");
|
||||
va_start(f, fmt);
|
||||
vsprintf(str+2, fmt, f);
|
||||
|
||||
static char TextBuf[1024*32];
|
||||
SendMessage(ScrollbackEdit, WM_GETTEXT, (WPARAM)sizeof(TextBuf),
|
||||
(LPARAM)TextBuf);
|
||||
|
||||
if(strlen(TextBuf) + strlen(str) + 1 <= sizeof(TextBuf)) {
|
||||
strcat(TextBuf, str);
|
||||
} else {
|
||||
lstrcpyn(TextBuf, str, sizeof(TextBuf));
|
||||
}
|
||||
|
||||
SendMessage(ScrollbackEdit, WM_SETTEXT, 0, (LPARAM)TextBuf);
|
||||
SendMessage(ScrollbackEdit, EM_LINESCROLL, 0, (LPARAM)INT_MAX);
|
||||
}
|
||||
|
||||
void ShowGraphWindow(void)
|
||||
{
|
||||
if(GraphWindow) return;
|
||||
|
||||
GraphWindow = CreateWindowEx(0, "Graph", "graphed",
|
||||
WS_OVERLAPPED | WS_BORDER | WS_MINIMIZEBOX | WS_SYSMENU |
|
||||
WS_SIZEBOX | WS_VISIBLE, 200, 150, 600, 500, NULL, NULL, NULL,
|
||||
NULL);
|
||||
if(!GraphWindow) oops();
|
||||
}
|
||||
|
||||
void HideGraphWindow(void)
|
||||
{
|
||||
if(GraphWindow) {
|
||||
DestroyWindow(GraphWindow);
|
||||
GraphWindow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void SetCommandEditTo(char *str)
|
||||
{
|
||||
SendMessage(CommandEdit, WM_SETTEXT, 0, (LPARAM)str);
|
||||
SendMessage(CommandEdit, EM_SETSEL, strlen(str), strlen(str));
|
||||
}
|
||||
|
||||
void ShowGui(void)
|
||||
{
|
||||
WNDCLASSEX wc;
|
||||
memset(&wc, 0, sizeof(wc));
|
||||
wc.cbSize = sizeof(wc);
|
||||
|
||||
wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC;
|
||||
wc.lpfnWndProc = (WNDPROC)CommandWindowProc;
|
||||
wc.hInstance = NULL;
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_BTNSHADOW);
|
||||
wc.lpszClassName = "Command";
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
|
||||
if(!RegisterClassEx(&wc)) oops();
|
||||
|
||||
wc.lpszClassName = "Graph";
|
||||
wc.lpfnWndProc = (WNDPROC)GraphWindowProc;
|
||||
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
|
||||
|
||||
if(!RegisterClassEx(&wc)) oops();
|
||||
|
||||
CommandWindow = CreateWindowEx(0, "Command", "prox",
|
||||
WS_OVERLAPPED | WS_BORDER | WS_MINIMIZEBOX | WS_SYSMENU |
|
||||
WS_SIZEBOX | WS_VISIBLE, 20, 20, 500, 400, NULL, NULL, NULL,
|
||||
NULL);
|
||||
if(!CommandWindow) oops();
|
||||
|
||||
ScrollbackEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "",
|
||||
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_MULTILINE |
|
||||
ES_AUTOVSCROLL | WS_VSCROLL, 0, 0, 0, 0, CommandWindow, NULL,
|
||||
NULL, NULL);
|
||||
|
||||
CommandEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "",
|
||||
WS_CHILD | WS_CLIPSIBLINGS | WS_TABSTOP | WS_VISIBLE |
|
||||
ES_AUTOHSCROLL, 0, 0, 0, 0, CommandWindow, NULL, NULL, NULL);
|
||||
|
||||
MyFixedFont = CreateFont(14, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE,
|
||||
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||||
FF_DONTCARE, "Lucida Console");
|
||||
if(!MyFixedFont)
|
||||
MyFixedFont = (HFONT)GetStockObject(SYSTEM_FONT);
|
||||
|
||||
FixedFont(ScrollbackEdit);
|
||||
FixedFont(CommandEdit);
|
||||
|
||||
ResizeCommandWindow();
|
||||
SetFocus(CommandEdit);
|
||||
|
||||
PrintToScrollback(">> Started prox, built " __DATE__ " " __TIME__);
|
||||
PrintToScrollback(">> Connected to device");
|
||||
|
||||
GreyPen = CreatePen(PS_SOLID, 1, RGB(100, 100, 100));
|
||||
GreenPen = CreatePen(PS_SOLID, 1, RGB(100, 255, 100));
|
||||
YellowPen = CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
|
||||
GreenBrush = CreateSolidBrush(RGB(100, 255, 100));
|
||||
YellowBrush = CreateSolidBrush(RGB(255, 255, 0));
|
||||
WhitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
|
||||
|
||||
CursorAPen = CreatePen(PS_DASH, 1, RGB(255, 255, 0));
|
||||
CursorBPen = CreatePen(PS_DASH, 1, RGB(255, 0, 255));
|
||||
|
||||
MSG msg;
|
||||
for(;;) {
|
||||
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||
if(msg.message == WM_KEYDOWN && msg.wParam == VK_RETURN) {
|
||||
char got[1024];
|
||||
SendMessage(CommandEdit, WM_GETTEXT, (WPARAM)sizeof(got),
|
||||
(LPARAM)got);
|
||||
|
||||
if(strcmp(got, "cls")==0) {
|
||||
SendMessage(ScrollbackEdit, WM_SETTEXT, 0, (LPARAM)"");
|
||||
} else {
|
||||
CommandReceived(got);
|
||||
}
|
||||
SendMessage(CommandEdit, WM_SETTEXT, 0, (LPARAM)"");
|
||||
|
||||
// Insert it into the command history, unless it is
|
||||
// identical to the previous command in the history.
|
||||
int prev = CommandHistoryNext - 1;
|
||||
if(prev < 0) prev += COMMAND_HISTORY_MAX;
|
||||
if(strcmp(CommandHistory[prev], got) != 0) {
|
||||
strcpy(CommandHistory[CommandHistoryNext], got);
|
||||
CommandHistoryNext++;
|
||||
if(CommandHistoryNext == COMMAND_HISTORY_MAX) {
|
||||
CommandHistoryNext = 0;
|
||||
}
|
||||
}
|
||||
CommandHistoryPos = -1;
|
||||
} else if(msg.message == WM_KEYDOWN && msg.wParam == VK_UP &&
|
||||
msg.hwnd == CommandEdit)
|
||||
{
|
||||
if(CommandHistoryPos == -1) {
|
||||
CommandHistoryPos = CommandHistoryNext;
|
||||
}
|
||||
CommandHistoryPos--;
|
||||
if(CommandHistoryPos < 0) {
|
||||
CommandHistoryPos = COMMAND_HISTORY_MAX-1;
|
||||
}
|
||||
SetCommandEditTo(CommandHistory[CommandHistoryPos]);
|
||||
} else if(msg.message == WM_KEYDOWN && msg.wParam == VK_DOWN &&
|
||||
msg.hwnd == CommandEdit)
|
||||
{
|
||||
CommandHistoryPos++;
|
||||
if(CommandHistoryPos >= COMMAND_HISTORY_MAX) {
|
||||
CommandHistoryPos = 0;
|
||||
}
|
||||
SetCommandEditTo(CommandHistory[CommandHistoryPos]);
|
||||
} else if(msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE &&
|
||||
msg.hwnd == CommandEdit)
|
||||
{
|
||||
SendMessage(CommandEdit, WM_SETTEXT, 0, (LPARAM)"");
|
||||
} else {
|
||||
if(msg.message == WM_KEYDOWN) {
|
||||
CommandHistoryPos = -1;
|
||||
}
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
|
||||
UsbCommand c;
|
||||
if(ReceiveCommandPoll(&c)) {
|
||||
UsbCommandReceived(&c);
|
||||
}
|
||||
|
||||
Sleep(10);
|
||||
}
|
||||
}
|
1787
winsrc/include/hidpi.h
Normal file
1787
winsrc/include/hidpi.h
Normal file
File diff suppressed because it is too large
Load diff
412
winsrc/include/hidsdi.h
Normal file
412
winsrc/include/hidsdi.h
Normal file
|
@ -0,0 +1,412 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 1996 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
HIDSDI.H
|
||||
|
||||
Abstract:
|
||||
|
||||
This module contains the PUBLIC definitions for the
|
||||
code that implements the HID dll.
|
||||
|
||||
Environment:
|
||||
|
||||
Kernel & user mode
|
||||
|
||||
--*/
|
||||
|
||||
|
||||
#ifndef _HIDSDI_H
|
||||
#define _HIDSDI_H
|
||||
|
||||
#include <pshpack4.h>
|
||||
|
||||
//#include "wtypes.h"
|
||||
|
||||
//#include <windef.h>
|
||||
//#include <win32.h>
|
||||
//#include <basetyps.h>
|
||||
|
||||
typedef LONG NTSTATUS;
|
||||
#include "hidusage.h"
|
||||
#include "hidpi.h"
|
||||
|
||||
typedef struct _HIDD_CONFIGURATION {
|
||||
PVOID cookie;
|
||||
ULONG size;
|
||||
ULONG RingBufferSize;
|
||||
} HIDD_CONFIGURATION, *PHIDD_CONFIGURATION;
|
||||
|
||||
typedef struct _HIDD_ATTRIBUTES {
|
||||
ULONG Size; // = sizeof (struct _HIDD_ATTRIBUTES)
|
||||
|
||||
//
|
||||
// Vendor ids of this hid device
|
||||
//
|
||||
USHORT VendorID;
|
||||
USHORT ProductID;
|
||||
USHORT VersionNumber;
|
||||
|
||||
//
|
||||
// Additional fields will be added to the end of this structure.
|
||||
//
|
||||
} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;
|
||||
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetAttributes (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PHIDD_ATTRIBUTES Attributes
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
Fill in the given HIDD_ATTRIBUTES structure with the attributes of the
|
||||
given hid device.
|
||||
|
||||
--*/
|
||||
|
||||
|
||||
void __stdcall
|
||||
HidD_GetHidGuid (
|
||||
OUT LPGUID HidGuid
|
||||
);
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetPreparsedData (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PHIDP_PREPARSED_DATA * PreparsedData
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
Given a handle to a valid Hid Class Device Object, retrieve the preparsed
|
||||
data for the device. This routine will allocate the appropriately
|
||||
sized buffer to hold this preparsed data. It is up to client to call
|
||||
HidP_FreePreparsedData to free the memory allocated to this structure when
|
||||
it is no longer needed.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device that the client obtains using
|
||||
a call to CreateFile on a valid Hid device string name.
|
||||
The string name can be obtained using standard PnP calls.
|
||||
|
||||
PreparsedData An opaque data structure used by other functions in this
|
||||
library to retrieve information about a given device.
|
||||
|
||||
Return Value:
|
||||
TRUE if successful.
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_FreePreparsedData (
|
||||
IN PHIDP_PREPARSED_DATA PreparsedData
|
||||
);
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_FlushQueue (
|
||||
IN HANDLE HidDeviceObject
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
Flush the input queue for the given HID device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device that the client obtains using
|
||||
a call to CreateFile on a valid Hid device string name.
|
||||
The string name can be obtained using standard PnP calls.
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetConfiguration (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PHIDD_CONFIGURATION Configuration,
|
||||
IN ULONG ConfigurationLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
Get the configuration information for this Hid device
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
Configuration A configuration structure. HidD_GetConfiguration MUST
|
||||
be called before the configuration can be modified and
|
||||
set using HidD_SetConfiguration
|
||||
|
||||
ConfigurationLength That is ``sizeof (HIDD_CONFIGURATION)''. Using this
|
||||
parameter, we can later increase the length of the
|
||||
configuration array and not break older apps.
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_SetConfiguration (
|
||||
IN HANDLE HidDeviceObject,
|
||||
IN PHIDD_CONFIGURATION Configuration,
|
||||
IN ULONG ConfigurationLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
Set the configuration information for this Hid device...
|
||||
|
||||
NOTE: HidD_GetConfiguration must be called to retrieve the current
|
||||
configuration information before this information can be modified
|
||||
and set.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
Configuration A configuration structure. HidD_GetConfiguration MUST
|
||||
be called before the configuration can be modified and
|
||||
set using HidD_SetConfiguration
|
||||
|
||||
ConfigurationLength That is ``sizeof (HIDD_CONFIGURATION)''. Using this
|
||||
parameter, we can later increase the length of the
|
||||
configuration array and not break older apps.
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetFeature (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PVOID ReportBuffer,
|
||||
IN ULONG ReportBufferLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
Retrieve a feature report from a HID device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
ReportBuffer The buffer that the feature report should be placed
|
||||
into. The first byte of the buffer should be set to
|
||||
the report ID of the desired report
|
||||
|
||||
ReportBufferLength The size (in bytes) of ReportBuffer. This value
|
||||
should be greater than or equal to the
|
||||
FeatureReportByteLength field as specified in the
|
||||
HIDP_CAPS structure for the device
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_SetFeature (
|
||||
IN HANDLE HidDeviceObject,
|
||||
IN PVOID ReportBuffer,
|
||||
IN ULONG ReportBufferLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
Send a feature report to a HID device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
ReportBuffer The buffer of the feature report to send to the device
|
||||
|
||||
ReportBufferLength The size (in bytes) of ReportBuffer. This value
|
||||
should be greater than or equal to the
|
||||
FeatureReportByteLength field as specified in the
|
||||
HIDP_CAPS structure for the device
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetNumInputBuffers (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PULONG NumberBuffers
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
This function returns the number of input buffers used by the specified
|
||||
file handle to the Hid device. Each file object has a number of buffers
|
||||
associated with it to queue reports read from the device but which have
|
||||
not yet been read by the user-mode app with a handle to that device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
NumberBuffers Number of buffers currently being used for this file
|
||||
handle to the Hid device
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_SetNumInputBuffers (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT ULONG NumberBuffers
|
||||
);
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
This function sets the number of input buffers used by the specified
|
||||
file handle to the Hid device. Each file object has a number of buffers
|
||||
associated with it to queue reports read from the device but which have
|
||||
not yet been read by the user-mode app with a handle to that device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
NumberBuffers New number of buffers to use for this file handle to
|
||||
the Hid device
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetPhysicalDescriptor (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PVOID Buffer,
|
||||
IN ULONG BufferLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
This function retrieves the raw physical descriptor for the specified
|
||||
Hid device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
Buffer Buffer which on return will contain the physical
|
||||
descriptor if one exists for the specified device
|
||||
handle
|
||||
|
||||
BufferLength Length of buffer (in bytes)
|
||||
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetManufacturerString (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PVOID Buffer,
|
||||
IN ULONG BufferLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
This function retrieves the manufacturer string from the specified
|
||||
Hid device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
Buffer Buffer which on return will contain the manufacturer
|
||||
string returned from the device. This string is a
|
||||
wide-character string
|
||||
|
||||
BufferLength Length of Buffer (in bytes)
|
||||
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetProductString (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PVOID Buffer,
|
||||
IN ULONG BufferLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
This function retrieves the product string from the specified
|
||||
Hid device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
Buffer Buffer which on return will contain the product
|
||||
string returned from the device. This string is a
|
||||
wide-character string
|
||||
|
||||
BufferLength Length of Buffer (in bytes)
|
||||
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetIndexedString (
|
||||
IN HANDLE HidDeviceObject,
|
||||
IN ULONG StringIndex,
|
||||
OUT PVOID Buffer,
|
||||
IN ULONG BufferLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
This function retrieves a string from the specified Hid device that is
|
||||
specified with a certain string index.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
StringIndex Index of the string to retrieve
|
||||
|
||||
Buffer Buffer which on return will contain the product
|
||||
string returned from the device. This string is a
|
||||
wide-character string
|
||||
|
||||
BufferLength Length of Buffer (in bytes)
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
BOOLEAN __stdcall
|
||||
HidD_GetSerialNumberString (
|
||||
IN HANDLE HidDeviceObject,
|
||||
OUT PVOID Buffer,
|
||||
IN ULONG BufferLength
|
||||
);
|
||||
/*++
|
||||
Routine Description:
|
||||
This function retrieves the serial number string from the specified
|
||||
Hid device.
|
||||
|
||||
Arguments:
|
||||
HidDeviceObject A handle to a Hid Device Object.
|
||||
|
||||
Buffer Buffer which on return will contain the serial number
|
||||
string returned from the device. This string is a
|
||||
wide-character string
|
||||
|
||||
BufferLength Length of Buffer (in bytes)
|
||||
|
||||
Return Value:
|
||||
TRUE if successful
|
||||
FALSE otherwise -- Use GetLastError() to get extended error information
|
||||
--*/
|
||||
|
||||
|
||||
#include <poppack.h>
|
||||
|
||||
#endif
|
263
winsrc/include/hidusage.h
Normal file
263
winsrc/include/hidusage.h
Normal file
|
@ -0,0 +1,263 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 1996, 1997 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
HIDUSAGE.H
|
||||
|
||||
Abstract:
|
||||
|
||||
Public Definitions of HID USAGES.
|
||||
|
||||
Environment:
|
||||
|
||||
Kernel & user mode
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef __HIDUSAGE_H__
|
||||
#define __HIDUSAGE_H__
|
||||
|
||||
//
|
||||
// Usage Pages
|
||||
//
|
||||
|
||||
typedef USHORT USAGE, *PUSAGE;
|
||||
|
||||
#define HID_USAGE_PAGE_GENERIC ((USAGE) 0x01)
|
||||
#define HID_USAGE_PAGE_SIMULATION ((USAGE) 0x02)
|
||||
#define HID_USAGE_PAGE_VR ((USAGE) 0x03)
|
||||
#define HID_USAGE_PAGE_SPORT ((USAGE) 0x04)
|
||||
#define HID_USAGE_PAGE_GAME ((USAGE) 0x05)
|
||||
#define HID_USAGE_PAGE_KEYBOARD ((USAGE) 0x07)
|
||||
#define HID_USAGE_PAGE_LED ((USAGE) 0x08)
|
||||
#define HID_USAGE_PAGE_BUTTON ((USAGE) 0x09)
|
||||
#define HID_USAGE_PAGE_ORDINAL ((USAGE) 0x0A)
|
||||
#define HID_USAGE_PAGE_TELEPHONY ((USAGE) 0x0B)
|
||||
#define HID_USAGE_PAGE_CONSUMER ((USAGE) 0x0C)
|
||||
#define HID_USAGE_PAGE_DIGITIZER ((USAGE) 0x0D)
|
||||
#define HID_USAGE_PAGE_UNICODE ((USAGE) 0x10)
|
||||
#define HID_USAGE_PAGE_ALPHANUMERIC ((USAGE) 0x14)
|
||||
|
||||
|
||||
//
|
||||
// Usages from Generic Desktop Page (0x01)
|
||||
//
|
||||
|
||||
#define HID_USAGE_GENERIC_POINTER ((USAGE) 0x01)
|
||||
#define HID_USAGE_GENERIC_MOUSE ((USAGE) 0x02)
|
||||
#define HID_USAGE_GENERIC_JOYSTICK ((USAGE) 0x04)
|
||||
#define HID_USAGE_GENERIC_GAMEPAD ((USAGE) 0x05)
|
||||
#define HID_USAGE_GENERIC_KEYBOARD ((USAGE) 0x06)
|
||||
#define HID_USAGE_GENERIC_KEYPAD ((USAGE) 0x07)
|
||||
#define HID_USAGE_GENERIC_SYSTEM_CTL ((USAGE) 0x80)
|
||||
|
||||
#define HID_USAGE_GENERIC_X ((USAGE) 0x30)
|
||||
#define HID_USAGE_GENERIC_Y ((USAGE) 0x31)
|
||||
#define HID_USAGE_GENERIC_Z ((USAGE) 0x32)
|
||||
#define HID_USAGE_GENERIC_RX ((USAGE) 0x33)
|
||||
#define HID_USAGE_GENERIC_RY ((USAGE) 0x34)
|
||||
#define HID_USAGE_GENERIC_RZ ((USAGE) 0x35)
|
||||
#define HID_USAGE_GENERIC_SLIDER ((USAGE) 0x36)
|
||||
#define HID_USAGE_GENERIC_DIAL ((USAGE) 0x37)
|
||||
#define HID_USAGE_GENERIC_WHEEL ((USAGE) 0x38)
|
||||
#define HID_USAGE_GENERIC_HATSWITCH ((USAGE) 0x39)
|
||||
#define HID_USAGE_GENERIC_COUNTED_BUFFER ((USAGE) 0x3A)
|
||||
#define HID_USAGE_GENERIC_BYTE_COUNT ((USAGE) 0x3B)
|
||||
#define HID_USAGE_GENERIC_MOTION_WAKEUP ((USAGE) 0x3C)
|
||||
#define HID_USAGE_GENERIC_VX ((USAGE) 0x40)
|
||||
#define HID_USAGE_GENERIC_VY ((USAGE) 0x41)
|
||||
#define HID_USAGE_GENERIC_VZ ((USAGE) 0x42)
|
||||
#define HID_USAGE_GENERIC_VBRX ((USAGE) 0x43)
|
||||
#define HID_USAGE_GENERIC_VBRY ((USAGE) 0x44)
|
||||
#define HID_USAGE_GENERIC_VBRZ ((USAGE) 0x45)
|
||||
#define HID_USAGE_GENERIC_VNO ((USAGE) 0x46)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_POWER ((USAGE) 0x81)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_SLEEP ((USAGE) 0x82)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_WAKE ((USAGE) 0x83)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU ((USAGE) 0x84)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_MAIN_MENU ((USAGE) 0x85)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_APP_MENU ((USAGE) 0x86)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_HELP_MENU ((USAGE) 0x87)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_MENU_EXIT ((USAGE) 0x88)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_MENU_SELECT ((USAGE) 0x89)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT ((USAGE) 0x8A)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_MENU_LEFT ((USAGE) 0x8B)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_MENU_UP ((USAGE) 0x8C)
|
||||
#define HID_USAGE_GENERIC_SYSCTL_MENU_DOWN ((USAGE) 0x8D)
|
||||
|
||||
//
|
||||
// Usages from Simulation Controls Page (0x02)
|
||||
//
|
||||
|
||||
#define HID_USAGE_SIMULATION_RUDDER ((USAGE) 0xBA)
|
||||
#define HID_USAGE_SIMULATION_THROTTLE ((USAGE) 0xBB)
|
||||
|
||||
//
|
||||
// Virtual Reality Controls Page (0x03)
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Sport Controls Page (0x04)
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Game Controls Page (0x05)
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Keyboard/Keypad Page (0x07)
|
||||
//
|
||||
|
||||
// Error "keys"
|
||||
#define HID_USAGE_KEYBOARD_NOEVENT ((USAGE) 0x00)
|
||||
#define HID_USAGE_KEYBOARD_ROLLOVER ((USAGE) 0x01)
|
||||
#define HID_USAGE_KEYBOARD_POSTFAIL ((USAGE) 0x02)
|
||||
#define HID_USAGE_KEYBOARD_UNDEFINED ((USAGE) 0x03)
|
||||
|
||||
// Letters
|
||||
#define HID_USAGE_KEYBOARD_aA ((USAGE) 0x04)
|
||||
#define HID_USAGE_KEYBOARD_zZ ((USAGE) 0x1D)
|
||||
// Numbers
|
||||
#define HID_USAGE_KEYBOARD_ONE ((USAGE) 0x1E)
|
||||
#define HID_USAGE_KEYBOARD_ZERO ((USAGE) 0x27)
|
||||
// Modifier Keys
|
||||
#define HID_USAGE_KEYBOARD_LCTRL ((USAGE) 0xE0)
|
||||
#define HID_USAGE_KEYBOARD_LSHFT ((USAGE) 0xE1)
|
||||
#define HID_USAGE_KEYBOARD_LALT ((USAGE) 0xE2)
|
||||
#define HID_USAGE_KEYBOARD_LGUI ((USAGE) 0xE3)
|
||||
#define HID_USAGE_KEYBOARD_RCTRL ((USAGE) 0xE4)
|
||||
#define HID_USAGE_KEYBOARD_RSHFT ((USAGE) 0xE5)
|
||||
#define HID_USAGE_KEYBOARD_RALT ((USAGE) 0xE6)
|
||||
#define HID_USAGE_KEYBOARD_RGUI ((USAGE) 0xE7)
|
||||
#define HID_USAGE_KEYBOARD_SCROLL_LOCK ((USAGE) 0x47)
|
||||
#define HID_USAGE_KEYBOARD_NUM_LOCK ((USAGE) 0x53)
|
||||
#define HID_USAGE_KEYBOARD_CAPS_LOCK ((USAGE) 0x39)
|
||||
// Funtion keys
|
||||
#define HID_USAGE_KEYBOARD_F1 ((USAGE) 0x3A)
|
||||
#define HID_USAGE_KEYBOARD_F12 ((USAGE) 0x45)
|
||||
|
||||
#define HID_USAGE_KEYBOARD_RETURN ((USAGE) 0x28)
|
||||
#define HID_USAGE_KEYBOARD_ESCAPE ((USAGE) 0x29)
|
||||
#define HID_USAGE_KEYBOARD_DELETE ((USAGE) 0x2A)
|
||||
|
||||
#define HID_USAGE_KEYBOARD_PRINT_SCREEN ((USAGE) 0x46)
|
||||
|
||||
// and hundreds more...
|
||||
|
||||
//
|
||||
// LED Page (0x08)
|
||||
//
|
||||
|
||||
#define HID_USAGE_LED_NUM_LOCK ((USAGE) 0x01)
|
||||
#define HID_USAGE_LED_CAPS_LOCK ((USAGE) 0x02)
|
||||
#define HID_USAGE_LED_SCROLL_LOCK ((USAGE) 0x03)
|
||||
#define HID_USAGE_LED_COMPOSE ((USAGE) 0x04)
|
||||
#define HID_USAGE_LED_KANA ((USAGE) 0x05)
|
||||
#define HID_USAGE_LED_POWER ((USAGE) 0x06)
|
||||
#define HID_USAGE_LED_SHIFT ((USAGE) 0x07)
|
||||
#define HID_USAGE_LED_DO_NOT_DISTURB ((USAGE) 0x08)
|
||||
#define HID_USAGE_LED_MUTE ((USAGE) 0x09)
|
||||
#define HID_USAGE_LED_TONE_ENABLE ((USAGE) 0x0A)
|
||||
#define HID_USAGE_LED_HIGH_CUT_FILTER ((USAGE) 0x0B)
|
||||
#define HID_USAGE_LED_LOW_CUT_FILTER ((USAGE) 0x0C)
|
||||
#define HID_USAGE_LED_EQUALIZER_ENABLE ((USAGE) 0x0D)
|
||||
#define HID_USAGE_LED_SOUND_FIELD_ON ((USAGE) 0x0E)
|
||||
#define HID_USAGE_LED_SURROUND_FIELD_ON ((USAGE) 0x0F)
|
||||
#define HID_USAGE_LED_REPEAT ((USAGE) 0x10)
|
||||
#define HID_USAGE_LED_STEREO ((USAGE) 0x11)
|
||||
#define HID_USAGE_LED_SAMPLING_RATE_DETECT ((USAGE) 0x12)
|
||||
#define HID_USAGE_LED_SPINNING ((USAGE) 0x13)
|
||||
#define HID_USAGE_LED_CAV ((USAGE) 0x14)
|
||||
#define HID_USAGE_LED_CLV ((USAGE) 0x15)
|
||||
#define HID_USAGE_LED_RECORDING_FORMAT_DET ((USAGE) 0x16)
|
||||
#define HID_USAGE_LED_OFF_HOOK ((USAGE) 0x17)
|
||||
#define HID_USAGE_LED_RING ((USAGE) 0x18)
|
||||
#define HID_USAGE_LED_MESSAGE_WAITING ((USAGE) 0x19)
|
||||
#define HID_USAGE_LED_DATA_MODE ((USAGE) 0x1A)
|
||||
#define HID_USAGE_LED_BATTERY_OPERATION ((USAGE) 0x1B)
|
||||
#define HID_USAGE_LED_BATTERY_OK ((USAGE) 0x1C)
|
||||
#define HID_USAGE_LED_BATTERY_LOW ((USAGE) 0x1D)
|
||||
#define HID_USAGE_LED_SPEAKER ((USAGE) 0x1E)
|
||||
#define HID_USAGE_LED_HEAD_SET ((USAGE) 0x1F)
|
||||
#define HID_USAGE_LED_HOLD ((USAGE) 0x20)
|
||||
#define HID_USAGE_LED_MICROPHONE ((USAGE) 0x21)
|
||||
#define HID_USAGE_LED_COVERAGE ((USAGE) 0x22)
|
||||
#define HID_USAGE_LED_NIGHT_MODE ((USAGE) 0x23)
|
||||
#define HID_USAGE_LED_SEND_CALLS ((USAGE) 0x24)
|
||||
#define HID_USAGE_LED_CALL_PICKUP ((USAGE) 0x25)
|
||||
#define HID_USAGE_LED_CONFERENCE ((USAGE) 0x26)
|
||||
#define HID_USAGE_LED_STAND_BY ((USAGE) 0x27)
|
||||
#define HID_USAGE_LED_CAMERA_ON ((USAGE) 0x28)
|
||||
#define HID_USAGE_LED_CAMERA_OFF ((USAGE) 0x29)
|
||||
#define HID_USAGE_LED_ON_LINE ((USAGE) 0x2A)
|
||||
#define HID_USAGE_LED_OFF_LINE ((USAGE) 0x2B)
|
||||
#define HID_USAGE_LED_BUSY ((USAGE) 0x2C)
|
||||
#define HID_USAGE_LED_READY ((USAGE) 0x2D)
|
||||
#define HID_USAGE_LED_PAPER_OUT ((USAGE) 0x2E)
|
||||
#define HID_USAGE_LED_PAPER_JAM ((USAGE) 0x2F)
|
||||
#define HID_USAGE_LED_REMOTE ((USAGE) 0x30)
|
||||
#define HID_USAGE_LED_FORWARD ((USAGE) 0x31)
|
||||
#define HID_USAGE_LED_REVERSE ((USAGE) 0x32)
|
||||
#define HID_USAGE_LED_STOP ((USAGE) 0x33)
|
||||
#define HID_USAGE_LED_REWIND ((USAGE) 0x34)
|
||||
#define HID_USAGE_LED_FAST_FORWARD ((USAGE) 0x35)
|
||||
#define HID_USAGE_LED_PLAY ((USAGE) 0x36)
|
||||
#define HID_USAGE_LED_PAUSE ((USAGE) 0x37)
|
||||
#define HID_USAGE_LED_RECORD ((USAGE) 0x38)
|
||||
#define HID_USAGE_LED_ERROR ((USAGE) 0x39)
|
||||
#define HID_USAGE_LED_SELECTED_INDICATOR ((USAGE) 0x3A)
|
||||
#define HID_USAGE_LED_IN_USE_INDICATOR ((USAGE) 0x3B)
|
||||
#define HID_USAGE_LED_MULTI_MODE_INDICATOR ((USAGE) 0x3C)
|
||||
#define HID_USAGE_LED_INDICATOR_ON ((USAGE) 0x3D)
|
||||
#define HID_USAGE_LED_INDICATOR_FLASH ((USAGE) 0x3E)
|
||||
#define HID_USAGE_LED_INDICATOR_SLOW_BLINK ((USAGE) 0x3F)
|
||||
#define HID_USAGE_LED_INDICATOR_FAST_BLINK ((USAGE) 0x40)
|
||||
#define HID_USAGE_LED_INDICATOR_OFF ((USAGE) 0x41)
|
||||
#define HID_USAGE_LED_FLASH_ON_TIME ((USAGE) 0x42)
|
||||
#define HID_USAGE_LED_SLOW_BLINK_ON_TIME ((USAGE) 0x43)
|
||||
#define HID_USAGE_LED_SLOW_BLINK_OFF_TIME ((USAGE) 0x44)
|
||||
#define HID_USAGE_LED_FAST_BLINK_ON_TIME ((USAGE) 0x45)
|
||||
#define HID_USAGE_LED_FAST_BLINK_OFF_TIME ((USAGE) 0x46)
|
||||
#define HID_USAGE_LED_INDICATOR_COLOR ((USAGE) 0x47)
|
||||
#define HID_USAGE_LED_RED ((USAGE) 0x48)
|
||||
#define HID_USAGE_LED_GREEN ((USAGE) 0x49)
|
||||
#define HID_USAGE_LED_AMBER ((USAGE) 0x4A)
|
||||
#define HID_USAGE_LED_GENERIC_INDICATOR ((USAGE) 0x3B)
|
||||
|
||||
//
|
||||
// Button Page (0x09)
|
||||
//
|
||||
// There is no need to label these usages.
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Ordinal Page (0x0A)
|
||||
//
|
||||
// There is no need to label these usages.
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Telephony Device Page (0x0B)
|
||||
//
|
||||
|
||||
#define HID_USAGE_TELEPHONY_PHONE ((USAGE) 0x01)
|
||||
#define HID_USAGE_TELEPHONY_ANSWERING_MACHINE ((USAGE) 0x02)
|
||||
#define HID_USAGE_TELEPHONY_MESSAGE_CONTROLS ((USAGE) 0x03)
|
||||
#define HID_USAGE_TELEPHONY_HANDSET ((USAGE) 0x04)
|
||||
#define HID_USAGE_TELEPHONY_HEADSET ((USAGE) 0x05)
|
||||
#define HID_USAGE_TELEPHONY_KEYPAD ((USAGE) 0x06)
|
||||
#define HID_USAGE_TELEPHONY_PROGRAMMABLE_BUTTON ((USAGE) 0x07)
|
||||
|
||||
//
|
||||
// and others...
|
||||
//
|
||||
|
||||
|
||||
#endif
|
379
winsrc/prox.cpp
Normal file
379
winsrc/prox.cpp
Normal file
|
@ -0,0 +1,379 @@
|
|||
#include <windows.h>
|
||||
#include <setupapi.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
extern "C" {
|
||||
#include "include/hidsdi.h"
|
||||
#include "include/hidpi.h"
|
||||
}
|
||||
|
||||
#include "prox.h"
|
||||
|
||||
#define OUR_VID 0x9ac4
|
||||
#define OUR_PID 0x4b8f
|
||||
|
||||
HANDLE UsbHandle;
|
||||
|
||||
static void ShowError(void)
|
||||
{
|
||||
char buf[1024];
|
||||
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), 0,
|
||||
buf, sizeof(buf), NULL);
|
||||
printf("ERROR: %s", buf);
|
||||
}
|
||||
|
||||
static BOOL UsbConnect(void)
|
||||
{
|
||||
typedef void (__stdcall *GetGuidProc)(GUID *);
|
||||
typedef BOOLEAN (__stdcall *GetAttrProc)(HANDLE, HIDD_ATTRIBUTES *);
|
||||
typedef BOOLEAN (__stdcall *GetPreparsedProc)(HANDLE,
|
||||
PHIDP_PREPARSED_DATA *);
|
||||
typedef NTSTATUS (__stdcall *GetCapsProc)(PHIDP_PREPARSED_DATA, PHIDP_CAPS);
|
||||
GetGuidProc getGuid;
|
||||
GetAttrProc getAttr;
|
||||
GetPreparsedProc getPreparsed;
|
||||
GetCapsProc getCaps;
|
||||
|
||||
HMODULE h = LoadLibrary("hid.dll");
|
||||
getGuid = (GetGuidProc)GetProcAddress(h, "HidD_GetHidGuid");
|
||||
getAttr = (GetAttrProc)GetProcAddress(h, "HidD_GetAttributes");
|
||||
getPreparsed = (GetPreparsedProc)GetProcAddress(h, "HidD_GetPreparsedData");
|
||||
getCaps = (GetCapsProc)GetProcAddress(h, "HidP_GetCaps");
|
||||
|
||||
GUID hidGuid;
|
||||
getGuid(&hidGuid);
|
||||
|
||||
HDEVINFO devInfo;
|
||||
devInfo = SetupDiGetClassDevs(&hidGuid, NULL, NULL,
|
||||
DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
|
||||
|
||||
SP_DEVICE_INTERFACE_DATA devInfoData;
|
||||
devInfoData.cbSize = sizeof(devInfoData);
|
||||
|
||||
int i;
|
||||
for(i = 0;; i++) {
|
||||
if(!SetupDiEnumDeviceInterfaces(devInfo, 0, &hidGuid, i, &devInfoData))
|
||||
{
|
||||
if(GetLastError() != ERROR_NO_MORE_ITEMS) {
|
||||
// printf("SetupDiEnumDeviceInterfaces failed\n");
|
||||
}
|
||||
// printf("done list\n");
|
||||
SetupDiDestroyDeviceInfoList(devInfo);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// printf("item %d:\n", i);
|
||||
|
||||
DWORD sizeReqd = 0;
|
||||
if(!SetupDiGetDeviceInterfaceDetail(devInfo, &devInfoData,
|
||||
NULL, 0, &sizeReqd, NULL))
|
||||
{
|
||||
if(GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
||||
// printf("SetupDiGetDeviceInterfaceDetail (0) failed\n");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
SP_DEVICE_INTERFACE_DETAIL_DATA *devInfoDetailData =
|
||||
(SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(sizeReqd);
|
||||
devInfoDetailData->cbSize = sizeof(*devInfoDetailData);
|
||||
|
||||
if(!SetupDiGetDeviceInterfaceDetail(devInfo, &devInfoData,
|
||||
devInfoDetailData, 87, NULL, NULL))
|
||||
{
|
||||
// printf("SetupDiGetDeviceInterfaceDetail (1) failed\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
char *path = devInfoDetailData->DevicePath;
|
||||
|
||||
UsbHandle = CreateFile(path, /*GENERIC_READ |*/ GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
|
||||
FILE_FLAG_OVERLAPPED, NULL);
|
||||
|
||||
if(UsbHandle == INVALID_HANDLE_VALUE) {
|
||||
ShowError();
|
||||
// printf("CreateFile failed: for '%s'\n", path);
|
||||
continue;
|
||||
}
|
||||
|
||||
HIDD_ATTRIBUTES attr;
|
||||
attr.Size = sizeof(attr);
|
||||
if(!getAttr(UsbHandle, &attr)) {
|
||||
ShowError();
|
||||
// printf("HidD_GetAttributes failed\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
// printf("VID: %04x PID %04x\n", attr.VendorID, attr.ProductID);
|
||||
|
||||
if(attr.VendorID != OUR_VID || attr.ProductID != OUR_PID) {
|
||||
CloseHandle(UsbHandle);
|
||||
// printf(" nope, not us\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
// printf ("got it!\n");
|
||||
CloseHandle(UsbHandle);
|
||||
|
||||
UsbHandle = CreateFile(path, GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
|
||||
FILE_FLAG_OVERLAPPED, NULL);
|
||||
|
||||
if(UsbHandle == INVALID_HANDLE_VALUE) {
|
||||
ShowError();
|
||||
// printf("Error, couldn't open our own handle as desired.\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
PHIDP_PREPARSED_DATA pp;
|
||||
getPreparsed(UsbHandle, &pp);
|
||||
HIDP_CAPS caps;
|
||||
|
||||
if(getCaps(pp, &caps) != HIDP_STATUS_SUCCESS) {
|
||||
// printf("getcaps failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// printf("input/out report %d/%d\n", caps.InputReportByteLength,
|
||||
// caps.OutputReportByteLength);
|
||||
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL ReceiveCommandPoll(UsbCommand *c)
|
||||
{
|
||||
static BOOL ReadInProgress = FALSE;
|
||||
static OVERLAPPED Ov;
|
||||
static BYTE Buf[65];
|
||||
static DWORD HaveRead;
|
||||
|
||||
if(!ReadInProgress) {
|
||||
memset(&Ov, 0, sizeof(Ov));
|
||||
ReadFile(UsbHandle, Buf, 65, &HaveRead, &Ov);
|
||||
if(GetLastError() != ERROR_IO_PENDING) {
|
||||
ShowError();
|
||||
exit(-1);
|
||||
}
|
||||
ReadInProgress = TRUE;
|
||||
}
|
||||
|
||||
if(HasOverlappedIoCompleted(&Ov)) {
|
||||
ReadInProgress = FALSE;
|
||||
|
||||
if(!GetOverlappedResult(UsbHandle, &Ov, &HaveRead, FALSE)) {
|
||||
ShowError();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
memcpy(c, Buf+1, 64);
|
||||
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void ReceiveCommand(UsbCommand *c)
|
||||
{
|
||||
while(!ReceiveCommandPoll(c)) {
|
||||
Sleep(0);
|
||||
}
|
||||
}
|
||||
|
||||
void SendCommand(UsbCommand *c, BOOL wantAck)
|
||||
{
|
||||
BYTE buf[65];
|
||||
buf[0] = 0;
|
||||
memcpy(buf+1, c, 64);
|
||||
|
||||
DWORD written;
|
||||
OVERLAPPED ov;
|
||||
memset(&ov, 0, sizeof(ov));
|
||||
WriteFile(UsbHandle, buf, 65, &written, &ov);
|
||||
if(GetLastError() != ERROR_IO_PENDING) {
|
||||
ShowError();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
while(!HasOverlappedIoCompleted(&ov)) {
|
||||
Sleep(0);
|
||||
}
|
||||
|
||||
if(!GetOverlappedResult(UsbHandle, &ov, &written, FALSE)) {
|
||||
ShowError();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if(wantAck) {
|
||||
UsbCommand ack;
|
||||
ReceiveCommand(&ack);
|
||||
if(ack.cmd != CMD_ACK) {
|
||||
printf("bad ACK\n");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static DWORD ExpectedAddr;
|
||||
static BYTE QueuedToSend[256];
|
||||
static BOOL AllWritten;
|
||||
|
||||
static void FlushPrevious(void)
|
||||
{
|
||||
UsbCommand c;
|
||||
memset(&c, 0, sizeof(c));
|
||||
|
||||
printf("expected = %08x flush, ", ExpectedAddr);
|
||||
|
||||
int i;
|
||||
for(i = 0; i < 240; i += 48) {
|
||||
c.cmd = CMD_SETUP_WRITE;
|
||||
memcpy(c.d.asBytes, QueuedToSend+i, 48);
|
||||
c.ext1 = (i/4);
|
||||
SendCommand(&c, TRUE);
|
||||
}
|
||||
|
||||
c.cmd = CMD_FINISH_WRITE;
|
||||
c.ext1 = (ExpectedAddr-1) & (~255);
|
||||
printf("c.ext1 = %08x\r", c.ext1);
|
||||
memcpy(c.d.asBytes, QueuedToSend+240, 16);
|
||||
SendCommand(&c, TRUE);
|
||||
|
||||
AllWritten = TRUE;
|
||||
}
|
||||
|
||||
static void GotByte(DWORD where, BYTE which)
|
||||
{
|
||||
AllWritten = FALSE;
|
||||
|
||||
if(where != ExpectedAddr) {
|
||||
printf("bad: got at %08x, expected at %08x\n", where, ExpectedAddr);
|
||||
exit(-1);
|
||||
}
|
||||
QueuedToSend[where & 255] = which;
|
||||
ExpectedAddr++;
|
||||
|
||||
if((where & 255) == 255) {
|
||||
// we have completed a full page
|
||||
FlushPrevious();
|
||||
}
|
||||
}
|
||||
|
||||
static int HexVal(int c)
|
||||
{
|
||||
c = tolower(c);
|
||||
if(c >= '0' && c <= '9') {
|
||||
return c - '0';
|
||||
} else if(c >= 'a' && c <= 'f') {
|
||||
return (c - 'a') + 10;
|
||||
} else {
|
||||
printf("bad hex digit '%c'\n", c);
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
static BYTE HexByte(char *s)
|
||||
{
|
||||
return (HexVal(s[0]) << 4) | HexVal(s[1]);
|
||||
}
|
||||
|
||||
static void LoadFlashFromSRecords(char *file, int addr)
|
||||
{
|
||||
ExpectedAddr = addr;
|
||||
|
||||
FILE *f = fopen(file, "r");
|
||||
if(!f) {
|
||||
printf("couldn't open file\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
char line[512];
|
||||
while(fgets(line, sizeof(line), f)) {
|
||||
if(memcmp(line, "S3", 2)==0) {
|
||||
char *s = line + 2;
|
||||
int len = HexByte(s) - 5;
|
||||
s += 2;
|
||||
|
||||
char addrStr[9];
|
||||
memcpy(addrStr, s, 8);
|
||||
addrStr[8] = '\0';
|
||||
DWORD addr;
|
||||
sscanf(addrStr, "%x", &addr);
|
||||
s += 8;
|
||||
|
||||
int i;
|
||||
for(i = 0; i < len; i++) {
|
||||
while((addr+i) > ExpectedAddr) {
|
||||
GotByte(ExpectedAddr, 0xff);
|
||||
}
|
||||
GotByte(addr+i, HexByte(s));
|
||||
s += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!AllWritten) FlushPrevious();
|
||||
|
||||
fclose(f);
|
||||
printf("\ndone.\n");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if(argc < 2) {
|
||||
printf("Usage: %s bootrom file.s19\n", argv[0]);
|
||||
printf(" %s load osimage.s19\n", argv[0]);
|
||||
printf(" %s fpga fpgaimg.s19\n", argv[0]);
|
||||
printf(" %s gui\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for(;;) {
|
||||
if(UsbConnect()) {
|
||||
break;
|
||||
}
|
||||
if(i == 0) {
|
||||
printf("...no device connected, polling for it now\n");
|
||||
}
|
||||
if(i > 50000) {
|
||||
printf("Could not connect to USB device; exiting.\n");
|
||||
return -1;
|
||||
}
|
||||
i++;
|
||||
Sleep(5);
|
||||
}
|
||||
|
||||
if(strcmp(argv[1], "bootrom")==0 || strcmp(argv[1], "load")==0 || strcmp(argv[1], "fpga")==0) {
|
||||
if(argc != 3) {
|
||||
printf("Need filename.\n");
|
||||
return -1;
|
||||
}
|
||||
if(strcmp(argv[1], "bootrom")==0) {
|
||||
LoadFlashFromSRecords(argv[2], 0);
|
||||
} else if(strcmp(argv[1], "fpga")==0) {
|
||||
LoadFlashFromSRecords(argv[2], 0x2000);
|
||||
} else {
|
||||
LoadFlashFromSRecords(argv[2], 0x10000);
|
||||
}
|
||||
} else if(strcmp(argv[1], "gui")==0) {
|
||||
ShowGui();
|
||||
} else if(strcmp(argv[1], "cmd")==0) {
|
||||
if(argc != 3) {
|
||||
printf("Need command.\n");
|
||||
return -1;
|
||||
}
|
||||
ExecCmd(argv[2]);
|
||||
} else {
|
||||
printf("Command '%s' not recognized.\n", argv[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
32
winsrc/prox.h
Normal file
32
winsrc/prox.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
#ifndef __PROX_H
|
||||
#define __PROX_H
|
||||
|
||||
#include "../include/usb_cmd.h"
|
||||
|
||||
// prox.cpp
|
||||
void ReceiveCommand(UsbCommand *c);
|
||||
BOOL ReceiveCommandPoll(UsbCommand *c);
|
||||
void SendCommand(UsbCommand *c, BOOL wantAck);
|
||||
|
||||
// gui.cpp
|
||||
void ShowGui(void);
|
||||
void HideGraphWindow(void);
|
||||
void ShowGraphWindow(void);
|
||||
void RepaintGraphWindow(void);
|
||||
void PrintToScrollback(char *fmt, ...);
|
||||
#define MAX_GRAPH_TRACE_LEN (1024*128)
|
||||
extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
|
||||
extern int GraphTraceLen;
|
||||
extern double CursorScaleFactor;
|
||||
extern int CommandFinished;
|
||||
|
||||
// command.cpp
|
||||
void CommandReceived(char *cmd);
|
||||
void UsbCommandReceived(UsbCommand *c);
|
||||
|
||||
// cmdline.cpp
|
||||
void ShowCommandline(void);
|
||||
void ExecCmd(char *cmd);
|
||||
//void PrintToScrollback(char *fmt, ...);
|
||||
|
||||
#endif
|
BIN
winsrc/vc90.pdb
Normal file
BIN
winsrc/vc90.pdb
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue