407 lines
11 KiB
C
407 lines
11 KiB
C
|
#define UNICODE
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <conio.h>
|
||
|
#include <ctype.h>
|
||
|
#include <wchar.h>
|
||
|
|
||
|
#define NT
|
||
|
//#include <tdi.h>
|
||
|
|
||
|
//#include <winsock2.h>
|
||
|
//#include <wsahelp.h>
|
||
|
|
||
|
//#include <tdistat.h>
|
||
|
//#include <tdiinfo.h>
|
||
|
//#include <llinfo.h>
|
||
|
#include <irioctl.h>
|
||
|
|
||
|
//#include <irda.h>
|
||
|
//#include <irlmp.h>
|
||
|
|
||
|
#define DBG_OUTPUT_DEBUGGER 1
|
||
|
#define DBG_OUTPUT_BUFFER 2
|
||
|
|
||
|
|
||
|
|
||
|
#define DBG_NDIS 0x00000002 // keep in sync with test\irdakdx
|
||
|
#define DBG_TIMER 0x00000004
|
||
|
#define DBG_IRMAC 0x00000008
|
||
|
|
||
|
#define DBG_IRLAP 0x00000010
|
||
|
#define DBG_IRLAPLOG 0x00000020
|
||
|
#define DBG_RXFRAME 0x00000040
|
||
|
#define DBG_TXFRAME 0x00000080
|
||
|
|
||
|
#define DBG_IRLMP 0x00000100
|
||
|
#define DBG_IRLMP_CONN 0x00000200
|
||
|
#define DBG_IRLMP_CRED 0x00000400
|
||
|
#define DBG_IRLMP_IAS 0x00000800
|
||
|
|
||
|
#define DBG_DISCOVERY 0x00001000
|
||
|
#define DBG_PRINT 0x00002000
|
||
|
#define DBG_ADDR 0x00004000
|
||
|
|
||
|
#define DBG_REF 0x00010000
|
||
|
|
||
|
#define DBG_TDI 0x00020000
|
||
|
#define DBG_TDI_IRP 0x00040000
|
||
|
|
||
|
#define DBG_ALLOC 0x10000000
|
||
|
#define DBG_FUNCTION 0x20000000
|
||
|
#define DBG_WARN 0x40000000
|
||
|
#define DBG_ERROR 0x80000000
|
||
|
|
||
|
|
||
|
#define IRDA_DEVICE_NAME TEXT("\\Device\\IrDA")
|
||
|
#define IRWAN_DEVICE_NAME TEXT("\\Device\\IrWAN")
|
||
|
|
||
|
OBJECT_ATTRIBUTES ObjAttr;
|
||
|
UNICODE_STRING DeviceName;
|
||
|
HANDLE DeviceHandle;
|
||
|
UINT i;
|
||
|
HANDLE hFile = 0;
|
||
|
BOOLEAN ConsoleOutput = TRUE;
|
||
|
DWORD KBThreadId;
|
||
|
UINT Dbgs[2];
|
||
|
UINT *pDbgSettings = Dbgs;
|
||
|
UINT *pDbgOutput = Dbgs+1;
|
||
|
|
||
|
HANDLE hMsgsEvent;
|
||
|
CRITICAL_SECTION Cs;
|
||
|
int State;
|
||
|
|
||
|
#define ST_RUNNING 0
|
||
|
#define ST_SETTING 1
|
||
|
#define ST_DONE 2
|
||
|
|
||
|
char Buf[2048];
|
||
|
|
||
|
#define ONOFF(bit) (bit & *pDbgSettings ? "On ": "Off")
|
||
|
|
||
|
void
|
||
|
DispCurrentSettings()
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||
|
|
||
|
Status = NtDeviceIoControlFile(
|
||
|
DeviceHandle, // HANDLE FileHandle
|
||
|
NULL, // HANDLE Event OPTIONAL
|
||
|
NULL, // PIO_APC_ROUTINE ApcRoutine
|
||
|
NULL, // PVOID ApcContext
|
||
|
&IoStatusBlock, // PIO_STATUS_BLOCK IoStatusBlock
|
||
|
IOCTL_IRDA_GET_DBG_SETTINGS, // ULONG IoControlCode
|
||
|
NULL, // PVOID InputBuffer
|
||
|
0, // ULONG InputBufferLength
|
||
|
Dbgs, // PVOID OutputBuffer
|
||
|
sizeof(Dbgs)); // ULONG OutputBufferLength
|
||
|
|
||
|
if (!NT_SUCCESS(Status))
|
||
|
{
|
||
|
printf("Ioctl failed %x\n", Status);
|
||
|
return;
|
||
|
}
|
||
|
printf("\nCurrent settings:\n");
|
||
|
printf(" A. RXFRAME...:%s B. TXFRAME...:%s\n",
|
||
|
ONOFF(DBG_RXFRAME), ONOFF(DBG_TXFRAME));
|
||
|
printf(" C. MAC.......:%s D. NDIS......:%s\n",
|
||
|
ONOFF(DBG_IRMAC), ONOFF(DBG_NDIS));
|
||
|
printf(" E. LAPLOG....:%s F. LAP.......:%s\n",
|
||
|
ONOFF(DBG_IRLAPLOG), ONOFF(DBG_IRLAP));
|
||
|
printf(" G. LMP.......:%s H. LMP_CONN..:%s\n",
|
||
|
ONOFF(DBG_IRLMP), ONOFF(DBG_IRLMP_CONN));
|
||
|
printf(" I. LMP_CREDIT:%s J. LMP_IAS:...%s\n",
|
||
|
ONOFF(DBG_IRLMP_CRED), ONOFF(DBG_IRLMP_IAS));
|
||
|
printf(" K. TDI.......:%s L. TDI_IRP...:%s\n",
|
||
|
ONOFF(DBG_TDI), ONOFF(DBG_TDI_IRP));
|
||
|
printf(" M. WARN......:%s N. ERROR.....:%s\n",
|
||
|
ONOFF(DBG_WARN), ONOFF(DBG_ERROR));
|
||
|
printf(" Output:\n");
|
||
|
printf(" O. Debugger..:%s\n",
|
||
|
*pDbgOutput & DBG_OUTPUT_DEBUGGER? "On" : "Off");
|
||
|
printf(" P. Console...:%s\n\n",
|
||
|
*pDbgOutput & DBG_OUTPUT_BUFFER? "On" : "Off");
|
||
|
|
||
|
printf(" <Enter> to continue\n");
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ULONG WINAPI
|
||
|
KBThread(LPVOID pvarg)
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||
|
int Key;
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
Key = _getch();
|
||
|
|
||
|
if (Key == 'q' || Key =='Q')
|
||
|
{
|
||
|
EnterCriticalSection(&Cs);
|
||
|
State = ST_DONE;
|
||
|
LeaveCriticalSection(&Cs);
|
||
|
SetEvent(hMsgsEvent);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (State != ST_SETTING && Key != 27)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
switch (Key)
|
||
|
{
|
||
|
case 13:
|
||
|
EnterCriticalSection(&Cs);
|
||
|
State = ST_RUNNING;
|
||
|
printf("running\n");
|
||
|
LeaveCriticalSection(&Cs);
|
||
|
continue;;
|
||
|
|
||
|
case 27:
|
||
|
EnterCriticalSection(&Cs);
|
||
|
if (State != ST_SETTING)
|
||
|
{
|
||
|
State = ST_SETTING;
|
||
|
DispCurrentSettings();
|
||
|
}
|
||
|
LeaveCriticalSection(&Cs);
|
||
|
continue;
|
||
|
|
||
|
case 'a':
|
||
|
case 'A':
|
||
|
*pDbgSettings ^= DBG_RXFRAME;
|
||
|
break;
|
||
|
|
||
|
case 'b':
|
||
|
case 'B':
|
||
|
*pDbgSettings ^= DBG_TXFRAME;
|
||
|
break;
|
||
|
|
||
|
case 'c':
|
||
|
case 'C':
|
||
|
*pDbgSettings ^= DBG_IRMAC;
|
||
|
break;
|
||
|
|
||
|
case 'd':
|
||
|
case 'D':
|
||
|
*pDbgSettings ^= DBG_NDIS;
|
||
|
break;
|
||
|
|
||
|
case 'e':
|
||
|
case 'E':
|
||
|
*pDbgSettings ^= DBG_IRLAPLOG;
|
||
|
break;
|
||
|
|
||
|
case 'f':
|
||
|
case 'F':
|
||
|
*pDbgSettings ^= DBG_IRLAP;
|
||
|
break;
|
||
|
|
||
|
case 'g':
|
||
|
case 'G':
|
||
|
*pDbgSettings ^= DBG_IRLMP;
|
||
|
break;
|
||
|
|
||
|
case 'h':
|
||
|
case 'H':
|
||
|
*pDbgSettings ^= DBG_IRLMP_CONN;
|
||
|
break;
|
||
|
|
||
|
case 'i':
|
||
|
case 'I':
|
||
|
*pDbgSettings ^= DBG_IRLMP_CRED;
|
||
|
break;
|
||
|
|
||
|
case 'j':
|
||
|
case 'J':
|
||
|
*pDbgSettings ^= DBG_IRLMP_IAS;
|
||
|
break;
|
||
|
|
||
|
case 'k':
|
||
|
case 'K':
|
||
|
*pDbgSettings ^= DBG_TDI;
|
||
|
break;
|
||
|
|
||
|
case 'l':
|
||
|
case 'L':
|
||
|
*pDbgSettings ^= DBG_TDI_IRP;
|
||
|
break;
|
||
|
|
||
|
case 'm':
|
||
|
case 'M':
|
||
|
*pDbgSettings ^= DBG_WARN;
|
||
|
break;
|
||
|
|
||
|
case 'n':
|
||
|
case 'N':
|
||
|
*pDbgSettings ^= DBG_ERROR;
|
||
|
break;
|
||
|
|
||
|
case 'o':
|
||
|
case 'O':
|
||
|
*pDbgOutput ^= DBG_OUTPUT_DEBUGGER;
|
||
|
break;
|
||
|
|
||
|
case 'p':
|
||
|
case 'P':
|
||
|
*pDbgOutput ^= DBG_OUTPUT_BUFFER;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
Status = NtDeviceIoControlFile(
|
||
|
DeviceHandle, // HANDLE FileHandle
|
||
|
NULL, // HANDLE Event OPTIONAL
|
||
|
NULL, // PIO_APC_ROUTINE ApcRoutine
|
||
|
NULL, // PVOID ApcContext
|
||
|
&IoStatusBlock, // PIO_STATUS_BLOCK IoStatusBlock
|
||
|
IOCTL_IRDA_SET_DBG_SETTINGS, // ULONG IoControlCode
|
||
|
Dbgs, // PVOID InputBuffer
|
||
|
sizeof(Dbgs), // ULONG InputBufferLength
|
||
|
NULL, // PVOID OutputBuffer
|
||
|
0); // ULONG OutputBufferLength
|
||
|
|
||
|
DispCurrentSettings();
|
||
|
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
_cdecl main(int argc, char *argv[])
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||
|
/*
|
||
|
if (argc > 1)
|
||
|
{
|
||
|
hFile = CreateFile(argv[1],
|
||
|
GENERIC_WRITE,
|
||
|
0,
|
||
|
NULL,
|
||
|
CREATE_ALWAYS,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL);
|
||
|
|
||
|
if (hFile == INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
printf("Couldn't open file %s\n", argv[1]);
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (argc == 3)
|
||
|
ConsoleOutput = FALSE;
|
||
|
*/
|
||
|
|
||
|
InitializeCriticalSection(&Cs);
|
||
|
|
||
|
State = ST_RUNNING;
|
||
|
|
||
|
hMsgsEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||
|
|
||
|
RtlInitUnicodeString(&DeviceName, IRDA_DEVICE_NAME);
|
||
|
// RtlInitUnicodeString(&DeviceName, IRWAN_DEVICE_NAME);
|
||
|
|
||
|
InitializeObjectAttributes(
|
||
|
&ObjAttr,
|
||
|
&DeviceName,
|
||
|
OBJ_CASE_INSENSITIVE,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
|
||
|
Status = NtCreateFile(
|
||
|
&DeviceHandle, // PHANDLE FileHandle
|
||
|
GENERIC_READ | GENERIC_WRITE, // ACCESS_MASK DesiredAccess
|
||
|
&ObjAttr, // POBJECT_ATTRIBUTES ObjAttr
|
||
|
&IoStatusBlock, // PIO_STATUS_BLOCK IoStatusBlock
|
||
|
NULL, // PLARGE_INTEGER AllocationSize
|
||
|
FILE_ATTRIBUTE_NORMAL, // ULONG FileAttributes
|
||
|
FILE_SHARE_DELETE | FILE_SHARE_READ |
|
||
|
FILE_SHARE_WRITE, // ULONG ShareAccess
|
||
|
FILE_OPEN_IF, // ULONG CreateDisposition
|
||
|
0, // ULONG CreateOptions
|
||
|
NULL, // PVOID EaBuffer
|
||
|
0); // ULONG EaLength
|
||
|
|
||
|
if (!NT_SUCCESS(Status))
|
||
|
{
|
||
|
printf("failed to open irda.sys\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
CreateThread(NULL, 0, KBThread, 0, 0, &KBThreadId);
|
||
|
|
||
|
|
||
|
printf("<Esc> to enter settings mode, <q> to quit\n");
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
Status = NtDeviceIoControlFile(
|
||
|
DeviceHandle, // HANDLE FileHandle
|
||
|
hMsgsEvent, // HANDLE Event OPTIONAL
|
||
|
NULL, // PIO_APC_ROUTINE ApcRoutine
|
||
|
Buf, // PVOID ApcContext
|
||
|
&IoStatusBlock, // PIO_STATUS_BLOCK IoStatusBlock
|
||
|
IOCTL_IRDA_GET_DBG_MSGS, // ULONG IoControlCode
|
||
|
NULL, // PVOID InputBuffer
|
||
|
0, // ULONG InputBufferLength
|
||
|
Buf, // PVOID OutputBuffer
|
||
|
sizeof(Buf)); // ULONG OutputBufferLength
|
||
|
|
||
|
|
||
|
if (Status != STATUS_PENDING && Status != STATUS_SUCCESS)
|
||
|
{
|
||
|
printf("ioctl failed %X\n", Status);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (Status == STATUS_PENDING)
|
||
|
{
|
||
|
WaitForSingleObject(hMsgsEvent, INFINITE);
|
||
|
|
||
|
EnterCriticalSection(&Cs);
|
||
|
|
||
|
if (State == ST_DONE)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LeaveCriticalSection(&Cs);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (IoStatusBlock.Information >= 2048)
|
||
|
{
|
||
|
printf("wow, too big\n");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (ConsoleOutput && State == ST_RUNNING)
|
||
|
fwrite(Buf, IoStatusBlock.Information, 1, stdout);
|
||
|
|
||
|
/*
|
||
|
if (hFile)
|
||
|
fwrite(Buf, 1, IoStatusBlock.Information, stdout);
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
NtClose(DeviceHandle);
|
||
|
|
||
|
return 0;
|
||
|
}
|