/*++ Copyright (C) Microsoft Corporation, 1993 - 1999 Module Name: parharns.c Abstract: This module contains code for test harness useage. Author: Robbie Harris (Hewlett-Packard) 15-October-1998 Environment: Kernel mode Revision History : --*/ #include "pch.h" // NOTE: PAR_TEST_HARNESS must be below pch.h ULONG devHarness1; // dummy - so this file is not an empty translation unit if !PAR_TEST_HARNESS #if PAR_TEST_HARNESS #include "parharns.h" #include "bucket.h" NTSTATUS ParHarnessLoad( IN PDEVICE_EXTENSION Extension ) { NTSTATUS status; RtlInitUnicodeString (&(Extension->ParTestHarness.deviceName), BUCKET_DEVICE_NAME); status = IoGetDeviceObjectPointer ( &(Extension->ParTestHarness.deviceName), FILE_ALL_ACCESS, &(Extension->ParTestHarness.file), &(Extension->ParTestHarness.device)); if (NT_SUCCESS(status)) { Extension->ParTestHarness.fnRead = (PVOID) arpReverse[Extension->IdxReverseProtocol].fnRead; Extension->ParTestHarness.fnRevSetInterfaceAddress = (PVOID) arpReverse[Extension->IdxReverseProtocol].fnSetInterfaceAddress; Extension->ParTestHarness.fnEnterReverse = (PVOID) arpReverse[Extension->IdxReverseProtocol].fnEnterReverse; Extension->ParTestHarness.fnExitReverse = (PVOID) arpReverse[Extension->IdxReverseProtocol].fnExitReverse; Extension->ParTestHarness.fnReadShadow = (PVOID) arpReverse[Extension->IdxReverseProtocol].fnReadShadow; Extension->ParTestHarness.fnHaveReadData = (PVOID) arpReverse[Extension->IdxReverseProtocol].fnHaveReadData; Extension->ParTestHarness.fnWrite = (PVOID) afpForward[Extension->IdxForwardProtocol].fnWrite; Extension->ParTestHarness.fnFwdSetInterfaceAddress = (PVOID) afpForward[Extension->IdxForwardProtocol].fnSetInterfaceAddress; Extension->ParTestHarness.fnEnterForward = (PVOID) afpForward[Extension->IdxForwardProtocol].fnEnterForward; Extension->ParTestHarness.fnExitForward = (PVOID) afpForward[Extension->IdxForwardProtocol].fnExitForward; arpReverse[Extension->IdxReverseProtocol].fnRead = ParHarnessRead; arpReverse[Extension->IdxReverseProtocol].fnSetInterfaceAddress = ParHarnessSetAddress; arpReverse[Extension->IdxReverseProtocol].fnEnterReverse = ParHarnessEnterReversePhase; arpReverse[Extension->IdxReverseProtocol].fnExitReverse = ParHarnessExitReversePhase; arpReverse[Extension->IdxReverseProtocol].fnReadShadow = NULL; arpReverse[Extension->IdxReverseProtocol].fnHaveReadData = ParHarnessHaveReadData; afpForward[Extension->IdxForwardProtocol].fnWrite = ParHarnessWrite; afpForward[Extension->IdxForwardProtocol].fnSetInterfaceAddress = ParHarnessSetAddress; afpForward[Extension->IdxForwardProtocol].fnEnterForward = ParHarnessEnterForwardPhase; afpForward[Extension->IdxForwardProtocol].fnExitForward = ParHarnessExitForwardPhase; } return status; } NTSTATUS ParHarnessEnterForwardPhase( IN PDEVICE_EXTENSION Extension ) { Extension->CurrentPhase = PHASE_FORWARD_IDLE; return STATUS_SUCCESS; } NTSTATUS ParHarnessExitForwardPhase( IN PDEVICE_EXTENSION Extension ) { Extension->CurrentPhase = PHASE_FORWARD_IDLE; return STATUS_SUCCESS; } NTSTATUS ParHarnessEnterReversePhase( IN PDEVICE_EXTENSION Extension ) { Extension->CurrentPhase = PHASE_REVERSE_IDLE; return STATUS_SUCCESS; } NTSTATUS ParHarnessExitReversePhase( IN PDEVICE_EXTENSION Extension ) { Extension->CurrentPhase = PHASE_FORWARD_IDLE; return STATUS_SUCCESS; } BOOLEAN ParHarnessHaveReadData ( IN PDEVICE_EXTENSION Extension ) { IO_STATUS_BLOCK iosbStatus; PIRP pIrp; KEVENT Event; char Buffer; NTSTATUS status; pIrp = IoBuildDeviceIoControlRequest(IOCTL_BUCKET_CLIENT_READ_PEEK, Extension->ParTestHarness.device, &Buffer, 1, NULL, 0, FALSE, &Event, &iosbStatus); status = IoCallDriver(Extension->ParTestHarness.device, pIrp); // Do we want to wait for the Irp to complete? return (BOOLEAN) (iosbStatus.Information > 0); } NTSTATUS ParHarnessRead( IN PDEVICE_EXTENSION Extension, IN PVOID Buffer, IN ULONG BufferSize, OUT PULONG BytesTransferred ) { NTSTATUS status; IO_STATUS_BLOCK iosbStatus; PIRP pIrp; KEVENT Event; *BytesTransferred = 0; pIrp = IoBuildDeviceIoControlRequest(IOCTL_BUCKET_CLIENT_READ, Extension->ParTestHarness.device, NULL, 0, Buffer, BufferSize, FALSE, &Event, &iosbStatus); status = IoCallDriver(Extension->ParTestHarness.device, pIrp); // Do we want to wait for the Irp to complete? if (NT_SUCCESS(status)) { *BytesTransferred = iosbStatus.Information; status = iosbStatus.Status; } return status; } NTSTATUS ParHarnessSetAddress( IN PDEVICE_EXTENSION Extension, IN UCHAR Address ) { NTSTATUS Status = STATUS_SUCCESS; // Dunno what to do? return Status; } NTSTATUS ParHarnessWrite( IN PDEVICE_EXTENSION Extension, IN PVOID Buffer, IN ULONG BufferSize, OUT PULONG BytesTransferred ) { NTSTATUS status; IO_STATUS_BLOCK iosbStatus; PIRP pIrp; KEVENT Event; *BytesTransferred = 0; pIrp = IoBuildDeviceIoControlRequest(IOCTL_BUCKET_CLIENT_WRITE, Extension->ParTestHarness.device, Buffer, BufferSize, NULL, 0, FALSE, &Event, &iosbStatus); status = IoCallDriver(Extension->ParTestHarness.device, pIrp); // Do we want to wait for the Irp to complete? if (NT_SUCCESS(status)) { *BytesTransferred = iosbStatus.Information; status = iosbStatus.Status; } return status; } NTSTATUS ParHarnessUnload( IN PDEVICE_EXTENSION Extension ) { NTSTATUS status = STATUS_SUCCESS; ObDereferenceObject(Extension->ParTestHarness.file); if (NT_SUCCESS(status)) { arpReverse[Extension->IdxReverseProtocol].fnRead = Extension->ParTestHarness.fnRead; arpReverse[Extension->IdxReverseProtocol].fnSetInterfaceAddress = Extension->ParTestHarness.fnRevSetInterfaceAddress; arpReverse[Extension->IdxReverseProtocol].fnEnterReverse = Extension->ParTestHarness.fnEnterReverse; arpReverse[Extension->IdxReverseProtocol].fnExitReverse = Extension->ParTestHarness.fnExitReverse; arpReverse[Extension->IdxReverseProtocol].fnReadShadow = Extension->ParTestHarness.fnReadShadow; arpReverse[Extension->IdxReverseProtocol].fnHaveReadData = Extension->ParTestHarness.fnHaveReadData; afpForward[Extension->IdxForwardProtocol].fnWrite = Extension->ParTestHarness.fnWrite; afpForward[Extension->IdxForwardProtocol].fnSetInterfaceAddress = Extension->ParTestHarness.fnFwdSetInterfaceAddress; afpForward[Extension->IdxForwardProtocol].fnEnterForward = Extension->ParTestHarness.fnEnterForward; afpForward[Extension->IdxForwardProtocol].fnExitForward = Extension->ParTestHarness.fnExitForward; } return status; } #endif