#define UNICODE #include #include #include #include #include #include #include #include #define NT //#include //#include //#include //#include //#include //#include #include //#include //#include #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(" 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(" to enter settings mode, 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; }