mirror of https://github.com/lianthony/NT4.0
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.
1573 lines
36 KiB
1573 lines
36 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
netdtect.c
|
|
|
|
Abstract:
|
|
|
|
This is the command line interface and execution for the
|
|
netdtect.exe tester.
|
|
|
|
Author:
|
|
|
|
Sean Selitrennikoff (SeanSe) October 1992
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
#include <windows.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ntddnetd.h>
|
|
#include "netdtect.h"
|
|
|
|
//
|
|
// This is the handle to the driver object.
|
|
//
|
|
HANDLE hFileHandle = (HANDLE)NULL;
|
|
|
|
|
|
|
|
BOOLEAN
|
|
DetectInitialInit(
|
|
IN PVOID DllHandle,
|
|
IN ULONG Reason,
|
|
IN PCONTEXT Context OPTIONAL
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine calls CreateFile to open the device driver.
|
|
|
|
Arguments:
|
|
|
|
DllHandle - Not Used
|
|
|
|
Reason - Attach or Detach
|
|
|
|
Context - Not Used
|
|
|
|
Return Value:
|
|
|
|
STATUS_SUCCESS
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
if (Reason == 0) {
|
|
|
|
//
|
|
// This is the close
|
|
//
|
|
|
|
if (hFileHandle != (HANDLE)NULL) {
|
|
|
|
CloseHandle( hFileHandle );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
NTSTATUS
|
|
DetectCheckPortUsage(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG Port,
|
|
IN ULONG Length
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for reading the port.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
Port - Port number to read from.
|
|
|
|
Length - Number of ports to check for.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.CPU.InterfaceType = InterfaceType;
|
|
CmdArgs.CPU.Port = Port;
|
|
CmdArgs.CPU.Length = Length;
|
|
CmdArgs.CPU.BusNumber = BusNumber;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_CPU,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
NTSTATUS
|
|
DetectReadPortUchar(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG Port,
|
|
OUT PUCHAR Value
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for reading the port.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
Port - Port number to read from.
|
|
|
|
Value - Pointer to place the result.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.RP.InterfaceType = InterfaceType;
|
|
CmdArgs.RP.Port = Port;
|
|
CmdArgs.RP.BusNumber = BusNumber;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_RPC,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
(PVOID)Value,
|
|
sizeof(UCHAR)
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectReadPortUshort(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG Port,
|
|
OUT PUSHORT Value
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for reading the port.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
Port - Port number to read from.
|
|
|
|
Value - Pointer to place the result.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.RP.InterfaceType = InterfaceType;
|
|
CmdArgs.RP.Port = Port;
|
|
CmdArgs.RP.BusNumber = BusNumber;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_RPS,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
(PVOID)Value,
|
|
sizeof(USHORT)
|
|
);
|
|
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
DetectReadPortUlong(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG Port,
|
|
OUT PULONG Value
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for reading the port.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
Port - Port number to read from.
|
|
|
|
Value - Pointer to place the result.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.RP.InterfaceType = InterfaceType;
|
|
CmdArgs.RP.Port = Port;
|
|
CmdArgs.RP.BusNumber = BusNumber;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_RPL,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
(PVOID)Value,
|
|
sizeof(ULONG)
|
|
);
|
|
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectWritePortUchar(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG Port,
|
|
IN UCHAR Value
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for writing the port.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
Port - Port number to write to.
|
|
|
|
Value - Value to write to the port.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.WPC.InterfaceType = InterfaceType;
|
|
CmdArgs.WPC.Port = Port;
|
|
CmdArgs.WPC.BusNumber = BusNumber;
|
|
CmdArgs.WPC.Value = Value;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_WPC,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
DetectWritePortUshort(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG Port,
|
|
IN USHORT Value
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for writing the port.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
Port - Port number to write to.
|
|
|
|
Value - Value to write to the port.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.WPS.InterfaceType = InterfaceType;
|
|
CmdArgs.WPS.Port = Port;
|
|
CmdArgs.WPS.BusNumber = BusNumber;
|
|
CmdArgs.WPS.Value = Value;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_WPS,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectWritePortUlong(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG Port,
|
|
IN ULONG Value
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for writing the port.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
Port - Port number to write to.
|
|
|
|
Value - Value to write to the port.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.WPL.InterfaceType = InterfaceType;
|
|
CmdArgs.WPL.Port = Port;
|
|
CmdArgs.WPL.BusNumber = BusNumber;
|
|
CmdArgs.WPL.Value = Value;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_WPL,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectCheckMemoryUsage(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG BaseAddress,
|
|
IN ULONG Length
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for reading the port.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
BaseAddress - Hardware address to play with.
|
|
|
|
Length - Number of ports to check for.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.CMU.InterfaceType = InterfaceType;
|
|
CmdArgs.CMU.BaseAddress = BaseAddress;
|
|
CmdArgs.CMU.Length = Length;
|
|
CmdArgs.CMU.BusNumber = BusNumber;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_CMU,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectReadMappedMemory(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG BaseAddress,
|
|
IN ULONG Length,
|
|
OUT PVOID Data
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for reading from memory.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
BaseAddress - Memory address to read from.
|
|
|
|
Length - Number of bytes to read.
|
|
|
|
Data - Pointer to data buffer at least Length bytes long to store
|
|
the data into.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.MEM.InterfaceType = InterfaceType;
|
|
CmdArgs.MEM.BusNumber = BusNumber;
|
|
CmdArgs.MEM.Address = BaseAddress;
|
|
CmdArgs.MEM.Length = Length;
|
|
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_RM,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
Data,
|
|
Length
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectWriteMappedMemory(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG BaseAddress,
|
|
IN ULONG Length,
|
|
IN PVOID Data
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for writing to memory.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
BaseAddress - Memory address to write to.
|
|
|
|
Length - Number of bytes to write.
|
|
|
|
Data - Pointer to data buffer at least Length bytes long containing
|
|
the bytes to write to memory.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.MEM.InterfaceType = InterfaceType;
|
|
CmdArgs.MEM.BusNumber = BusNumber;
|
|
CmdArgs.MEM.Address = BaseAddress;
|
|
CmdArgs.MEM.Length = Length;
|
|
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_WM,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
Data,
|
|
Length
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectSetInterruptTrap(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
OUT PHANDLE TrapHandle,
|
|
IN UCHAR InterruptList[],
|
|
IN ULONG InterruptListLength
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for claiming a range of interrupts.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Type of bus (ISA, EISA)
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
TrapHandle - A pointer to a handle for storing a handle for this
|
|
interrupt trap.
|
|
|
|
InterruptList - A pointer to a list of interrupt numbers to try and
|
|
trap.
|
|
|
|
InterruptListLength - Number of numbers in InterruptList.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.SIT.TrapHandle = NULL;
|
|
CmdArgs.SIT.InterruptListLength = InterruptListLength;
|
|
CmdArgs.SIT.InterfaceType = InterfaceType;
|
|
CmdArgs.SIT.BusNumber = BusNumber;
|
|
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_SIT,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
(PVOID)InterruptList,
|
|
InterruptListLength
|
|
);
|
|
|
|
if (NtStatus == STATUS_SUCCESS) {
|
|
|
|
*TrapHandle = CmdArgs.SIT.TrapHandle;
|
|
|
|
} else {
|
|
|
|
*TrapHandle = (HANDLE)NULL;
|
|
|
|
}
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectQueryInterruptTrap(
|
|
IN HANDLE TrapHandle,
|
|
OUT UCHAR InterruptList[],
|
|
IN ULONG InterruptListLength
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for querying a previously set up
|
|
interrupt trap.
|
|
|
|
Arguments:
|
|
|
|
TrapHandle - The handle from a SetInterruptTrap call.
|
|
|
|
InterruptList - A pointer to an array for storing the results of the
|
|
query. The first index corresponds to the first index of the
|
|
SetInterruptTrap call, etc.
|
|
|
|
InterruptListLength - Number of spaces in InterruptList, this must be
|
|
at least as long as the list passed to SetInterruptTrap.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
if (TrapHandle == NULL) {
|
|
return(STATUS_INVALID_HANDLE);
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.QIT.TrapHandle = TrapHandle;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_QIT,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
(PVOID)InterruptList,
|
|
InterruptListLength
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectRemoveInterruptTrap(
|
|
IN HANDLE TrapHandle
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for removing a previously set up
|
|
interrupt trap.
|
|
|
|
Arguments:
|
|
|
|
TrapHandle - The handle from a SetInterruptTrap call.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
if (TrapHandle == NULL) {
|
|
return(STATUS_INVALID_HANDLE);
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.RIT.TrapHandle = TrapHandle;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_RIT,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
NULL,
|
|
0
|
|
);
|
|
return(NtStatus);
|
|
}
|
|
|
|
NTSTATUS
|
|
DetectClaimResource(
|
|
IN ULONG NumberOfResources,
|
|
IN PVOID Data
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for claiming resources.
|
|
|
|
Arguments:
|
|
|
|
NumberOfResources - Number of elements in Data.
|
|
|
|
Claim - Should the values be claimed?
|
|
|
|
Data - Pointer to data buffer at least Length bytes long containing
|
|
the bytes to write to memory.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.CR.NumberOfResources = NumberOfResources;
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_CR,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
Data,
|
|
NumberOfResources * sizeof(NETDTECT_RESOURCE)
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
NTSTATUS
|
|
DetectTemporaryClaimResource(
|
|
IN PNETDTECT_RESOURCE Resource
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for temporarily claiming a resource.
|
|
|
|
Arguments:
|
|
|
|
Resource - The resource to claim.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_TCR,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
Resource,
|
|
sizeof(NETDTECT_RESOURCE)
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
NTSTATUS
|
|
DetectFreeSpecificTemporaryResource(
|
|
IN PNETDTECT_RESOURCE Resource
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for temporarily claiming a resource.
|
|
|
|
Arguments:
|
|
|
|
Resource - The resource to claim.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL)
|
|
{
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL);
|
|
if ( hFileHandle == (HANDLE)-1 )
|
|
{
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
}
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_FTSR,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
Resource,
|
|
sizeof(NETDTECT_RESOURCE));
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectFreeTemporaryResources(
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for freeing all temporarily claimed resources.
|
|
|
|
Arguments:
|
|
|
|
NONE
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_FTR,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
NULL,
|
|
0
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
DetectReadPciSlotInformation(
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN ULONG Offset,
|
|
IN ULONG Length,
|
|
OUT PVOID Data
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for reading from PCI config space.
|
|
|
|
Arguments:
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
SlotNumber - The slot number to read from.
|
|
|
|
Offset - The offset within config space to read from.
|
|
|
|
Length - Number of bytes to read.
|
|
|
|
Data - Pointer to data buffer at least Length bytes long to store
|
|
the data into.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.PCI.SlotNumber = SlotNumber;
|
|
CmdArgs.PCI.BusNumber = BusNumber;
|
|
CmdArgs.PCI.Offset = Offset;
|
|
CmdArgs.PCI.Length = Length;
|
|
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_RPCI,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
Data,
|
|
Length
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
DetectWritePciSlotInformation(
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN ULONG Offset,
|
|
IN ULONG Length,
|
|
IN PVOID Data
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine sends off the IOCTL for writing to PCI config space.
|
|
|
|
Arguments:
|
|
|
|
BusNumber - Bus number in the system.
|
|
|
|
SlotNumber - The slot number to write to.
|
|
|
|
Offset - The offset within config space to write to.
|
|
|
|
Length - Number of bytes to write.
|
|
|
|
Data - Pointer to data buffer at least Length bytes long containing
|
|
the bytes to write to memory.
|
|
|
|
Return Value:
|
|
|
|
The status of the call.
|
|
|
|
--*/
|
|
{
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
CMD_ARGS CmdArgs;
|
|
NTSTATUS NtStatus;
|
|
|
|
if (hFileHandle == NULL) {
|
|
|
|
hFileHandle = CreateFile(
|
|
DLL_CREATE_DEVICE_NAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL, // lpSecurityAttirbutes
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
|
|
NULL // lpTemplateFile
|
|
);
|
|
|
|
if ( hFileHandle == (HANDLE)-1 ) {
|
|
NtStatus = GetLastError();
|
|
return(NtStatus);
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Set this value
|
|
//
|
|
|
|
CmdArgs.PCI.SlotNumber = SlotNumber;
|
|
CmdArgs.PCI.BusNumber = BusNumber;
|
|
CmdArgs.PCI.Offset = Offset;
|
|
CmdArgs.PCI.Length = Length;
|
|
|
|
|
|
NtStatus = NtDeviceIoControlFile(
|
|
hFileHandle,
|
|
NULL, // Event
|
|
NULL, // ApcRoutine
|
|
NULL, // ApcContext
|
|
&IoStatusBlock,
|
|
IOCTL_NETDTECT_WPCI,
|
|
(PVOID)(&CmdArgs),
|
|
sizeof(CMD_ARGS),
|
|
Data,
|
|
Length
|
|
);
|
|
|
|
return(NtStatus);
|
|
}
|
|
|
|
|