Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

406 lines
11 KiB

#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;
}