mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 19:43:04 +00:00
- Updated CSQ library to use new kmlibrary target type
- Updated includes in csq.c - Added IPv6 ethertype in lan.h - Fixed a typo in ip.c - Added csqtest driver for testing cancel-safe queues svn path=/trunk/; revision=8107
This commit is contained in:
parent
9a53ebcb92
commit
f9d689b644
9 changed files with 284 additions and 10 deletions
|
@ -1,10 +1,9 @@
|
||||||
PATH_TO_TOP = ../../..
|
PATH_TO_TOP = ../../..
|
||||||
TARGET_TYPE = driver_library
|
|
||||||
TARGET_NAME = csq
|
|
||||||
TARGET_NORC = yes
|
|
||||||
TARGET_CFLAGS = -Wall -Werror
|
|
||||||
|
|
||||||
|
TARGET_TYPE = kmlibrary
|
||||||
|
TARGET_NAME = csq
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
TARGET_OBJECTS = csq.o
|
TARGET_OBJECTS = csq.o
|
||||||
#TARGET_GCCLIBS = gcc
|
|
||||||
include $(PATH_TO_TOP)/rules.mak
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
include $(TOOLS_PATH)/helper.mk
|
include $(TOOLS_PATH)/helper.mk
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
* processor can create races too.
|
* processor can create races too.
|
||||||
*/
|
*/
|
||||||
#define __NTDRIVER__
|
#define __NTDRIVER__
|
||||||
#include <ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include "csq.h"
|
#include <ddk/csq.h>
|
||||||
|
|
||||||
|
|
||||||
VOID NTAPI IopCsqCancelRoutine(PDEVICE_OBJECT DeviceObject,
|
VOID NTAPI IopCsqCancelRoutine(PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
#define __LAN_H
|
#define __LAN_H
|
||||||
|
|
||||||
|
|
||||||
/* Medias we support */
|
/* Media we support */
|
||||||
#define MEDIA_ETH 0
|
#define MEDIA_ETH 0
|
||||||
|
|
||||||
#define MAX_MEDIA 1
|
#define MAX_MEDIA 1
|
||||||
|
@ -71,7 +71,7 @@ typedef struct LAN_ADAPTER {
|
||||||
/* Ethernet types. We swap constants so we can compare values at runtime
|
/* Ethernet types. We swap constants so we can compare values at runtime
|
||||||
without swapping them there */
|
without swapping them there */
|
||||||
#define ETYPE_IPv4 WH2N(0x0800)
|
#define ETYPE_IPv4 WH2N(0x0800)
|
||||||
#define ETYPE_IPv6 WH2N(0x0000) /* FIXME */
|
#define ETYPE_IPv6 WH2N(0x86DD)
|
||||||
#define ETYPE_ARP WH2N(0x0806)
|
#define ETYPE_ARP WH2N(0x0806)
|
||||||
|
|
||||||
/* Protocols */
|
/* Protocols */
|
||||||
|
|
|
@ -84,7 +84,8 @@ VOID FreeIF(
|
||||||
|
|
||||||
|
|
||||||
PADDRESS_ENTRY CreateADE(
|
PADDRESS_ENTRY CreateADE(
|
||||||
PIP_INTERFACE IF, PIP_ADDRESS Address,
|
PIP_INTERFACE IF,
|
||||||
|
PIP_ADDRESS Address,
|
||||||
UCHAR Type,
|
UCHAR Type,
|
||||||
PNET_TABLE_ENTRY NTE)
|
PNET_TABLE_ENTRY NTE)
|
||||||
/*
|
/*
|
||||||
|
|
10
reactos/drivers/test/csqtest/GNUmakefile
Normal file
10
reactos/drivers/test/csqtest/GNUmakefile
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
PATH_TO_TOP = ../../..
|
||||||
|
|
||||||
|
TARGET_TYPE = driver
|
||||||
|
TARGET_NAME = csqtest
|
||||||
|
TARGET_DDKLIBS = csq.a
|
||||||
|
TARGET_CFLAGS = -Wall -Werror
|
||||||
|
TARGET_OBJECTS = csqtest.o
|
||||||
|
|
||||||
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
include $(TOOLS_PATH)/helper.mk
|
7
reactos/drivers/test/csqtest/Makefile
Normal file
7
reactos/drivers/test/csqtest/Makefile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#
|
||||||
|
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
|
||||||
|
# file to this component. This file merely indirects to the real make file
|
||||||
|
# that is shared by all the components of Windows NT
|
||||||
|
#
|
||||||
|
!INCLUDE $(NTMAKEENV)\makefile.def
|
||||||
|
|
5
reactos/drivers/test/csqtest/SOURCES
Normal file
5
reactos/drivers/test/csqtest/SOURCES
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
TARGETNAME=csqtest
|
||||||
|
TARGETTYPE=DRIVER
|
||||||
|
TARGETPATH=obj
|
||||||
|
TARGETLIBS= csq.lib
|
||||||
|
SOURCES= csqtest.c
|
214
reactos/drivers/test/csqtest/csqtest.c
Normal file
214
reactos/drivers/test/csqtest/csqtest.c
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
/*
|
||||||
|
* CSQ Test Driver
|
||||||
|
* Copyright (c) 2004, Vizzini (vizzini@plasmic.com)
|
||||||
|
* Released under the GNU GPL for the ReactOS project
|
||||||
|
*
|
||||||
|
* This driver is designed to exercise the cancel-safe IRP queue logic.
|
||||||
|
* Please refer to reactos/include/ddk/csq.h and reactos/drivers/lib/csq.
|
||||||
|
*/
|
||||||
|
#include <ntddk.h>
|
||||||
|
#include <ddk/csq.h>
|
||||||
|
|
||||||
|
/* XXX shortcomings in our headers... */
|
||||||
|
#define assert(x)
|
||||||
|
#ifndef KdPrint
|
||||||
|
#define KdPrint(x) DbgPrint x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Device name */
|
||||||
|
#define NT_DEVICE_NAME L"\\Device\\csqtest"
|
||||||
|
|
||||||
|
/* DosDevices name */
|
||||||
|
#define DOS_DEVICE_NAME L"\\??\\csqtest"
|
||||||
|
|
||||||
|
/* Global CSQ struct that the CSQ functions init */
|
||||||
|
IO_CSQ Csq;
|
||||||
|
|
||||||
|
/* List and lock for the actual IRP queue */
|
||||||
|
LIST_ENTRY IrpQueue;
|
||||||
|
KSPIN_LOCK IrpQueueLock;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CSQ Callbacks
|
||||||
|
*/
|
||||||
|
VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, PIRP Irp)
|
||||||
|
{
|
||||||
|
KdPrint(("Inserting IRP 0x%x into CSQ\n", Irp));
|
||||||
|
InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, PIRP Irp)
|
||||||
|
{
|
||||||
|
KdPrint(("Removing IRP 0x%x from CSQ\n", Irp));
|
||||||
|
RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, PIRP Irp, PVOID PeekContext)
|
||||||
|
{
|
||||||
|
KdPrint(("Peeking for next IRP\n"));
|
||||||
|
|
||||||
|
if(Irp)
|
||||||
|
return CONTAINING_RECORD(&Irp->Tail.Overlay.ListEntry.Flink, IRP, Tail.Overlay.ListEntry);
|
||||||
|
|
||||||
|
if(IsListEmpty(&IrpQueue))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return CONTAINING_RECORD(IrpQueue.Flink, IRP, Tail.Overlay.ListEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, PKIRQL Irql)
|
||||||
|
{
|
||||||
|
KdPrint(("Acquiring spin lock\n"));
|
||||||
|
KeAcquireSpinLock(&IrpQueueLock, Irql);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, KIRQL Irql)
|
||||||
|
{
|
||||||
|
KdPrint(("Releasing spin lock\n"));
|
||||||
|
KeReleaseSpinLock(&IrpQueueLock, Irql);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NTAPI CsqCompleteCancelledIrp(PIO_CSQ Csq, PIRP Irp)
|
||||||
|
{
|
||||||
|
KdPrint(("cancelling irp 0x%x\n", Irp));
|
||||||
|
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI CsqInsertIrpEx(PIO_CSQ Csq, PIRP Irp, PVOID InsertContext)
|
||||||
|
/*
|
||||||
|
* FUNCTION: Insert into IRP queue, with extra context
|
||||||
|
*
|
||||||
|
* NOTE: Switch call in DriverEntry to IoCsqInitializeEx to use this
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
CsqInsertIrp(Csq, Irp);
|
||||||
|
return STATUS_PENDING;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DISPATCH ROUTINES
|
||||||
|
*/
|
||||||
|
|
||||||
|
NTSTATUS NTAPI DispatchCreateCloseCleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
|
{
|
||||||
|
PIO_STACK_LOCATION StackLocation = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
|
||||||
|
if(StackLocation->MajorFunction == IRP_MJ_CLEANUP)
|
||||||
|
{
|
||||||
|
/* flush the irp queue */
|
||||||
|
PIRP CurrentIrp;
|
||||||
|
|
||||||
|
KdPrint(("csqtest: Cleanup received; flushing the IRP queue with cancel\n"));
|
||||||
|
|
||||||
|
while((CurrentIrp = IoCsqRemoveNextIrp(&Csq, 0)))
|
||||||
|
{
|
||||||
|
CurrentIrp->IoStatus.Status = STATUS_CANCELLED;
|
||||||
|
CurrentIrp->IoStatus.Information = 0;
|
||||||
|
|
||||||
|
IoCompleteRequest(CurrentIrp, IO_NO_INCREMENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI DispatchReadWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
|
{
|
||||||
|
/* According to the cancel sample in the DDK, IoCsqInsertIrp() marks the irp pending */
|
||||||
|
/* However, I think it's wrong. */
|
||||||
|
IoMarkIrpPending(Irp);
|
||||||
|
IoCsqInsertIrp(&Csq, Irp, 0);
|
||||||
|
|
||||||
|
return STATUS_PENDING;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS NTAPI DispatchIoctl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
|
/*
|
||||||
|
* all IOCTL requests flush the irp queue
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
PIRP CurrentIrp;
|
||||||
|
|
||||||
|
KdPrint(("csqtest: Ioctl received; flushing the IRP queue with success\n"));
|
||||||
|
|
||||||
|
while((CurrentIrp = IoCsqRemoveNextIrp(&Csq, 0)))
|
||||||
|
{
|
||||||
|
CurrentIrp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
CurrentIrp->IoStatus.Information = 0;
|
||||||
|
|
||||||
|
IoCompleteRequest(CurrentIrp, IO_NO_INCREMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NTAPI Unload(PDRIVER_OBJECT DriverObject)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DriverEntry
|
||||||
|
*/
|
||||||
|
|
||||||
|
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
UNICODE_STRING NtName;
|
||||||
|
UNICODE_STRING DosName;
|
||||||
|
PDEVICE_OBJECT DeviceObject;
|
||||||
|
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)DispatchReadWrite;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)DispatchReadWrite;
|
||||||
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)DispatchIoctl;
|
||||||
|
DriverObject->DriverUnload = (PDRIVER_UNLOAD)Unload;
|
||||||
|
|
||||||
|
Status = IoCsqInitialize(&Csq, (PIO_CSQ_INSERT_IRP)CsqInsertIrp, CsqRemoveIrp, CsqPeekNextIrp,
|
||||||
|
CsqAcquireLock, (PIO_CSQ_RELEASE_LOCK)CsqReleaseLock, CsqCompleteCancelledIrp);
|
||||||
|
|
||||||
|
if(Status != STATUS_SUCCESS)
|
||||||
|
KdPrint(("csqtest: IoCsqInitalize failed: 0x%x\n", Status));
|
||||||
|
else
|
||||||
|
KdPrint(("csqtest: IoCsqInitalize succeeded\n"));
|
||||||
|
|
||||||
|
InitializeListHead(&IrpQueue);
|
||||||
|
KeInitializeSpinLock(&IrpQueueLock);
|
||||||
|
|
||||||
|
/* Set up a device */
|
||||||
|
RtlInitUnicodeString(&NtName, NT_DEVICE_NAME);
|
||||||
|
Status = IoCreateDevice(DriverObject, 0, &NtName, FILE_DEVICE_UNKNOWN, 0, 0, &DeviceObject);
|
||||||
|
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
KdPrint(("csqtest: Unable to create device: 0x%x\n", Status));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlInitUnicodeString(&DosName, DOS_DEVICE_NAME);
|
||||||
|
Status = IoCreateSymbolicLink(&DosName, &NtName);
|
||||||
|
|
||||||
|
if(!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
KdPrint(("csqtest: Unable to create link: 0x%x\n", Status));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceObject->Flags |= DO_BUFFERED_IO;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
38
reactos/drivers/test/csqtest/csqtest.rc
Normal file
38
reactos/drivers/test/csqtest/csqtest.rc
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#include <defines.h>
|
||||||
|
#include <reactos/resource.h>
|
||||||
|
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION RES_UINT_FV_MAJOR,RES_UINT_FV_MINOR,RES_UINT_FV_REVISION,RES_UINT_FV_BUILD
|
||||||
|
PRODUCTVERSION RES_UINT_PV_MAJOR,RES_UINT_PV_MINOR,RES_UINT_PV_REVISION,RES_UINT_PV_BUILD
|
||||||
|
FILEFLAGSMASK 0x3fL
|
||||||
|
#ifdef _DEBUG
|
||||||
|
FILEFLAGS 0x1L
|
||||||
|
#else
|
||||||
|
FILEFLAGS 0x0L
|
||||||
|
#endif
|
||||||
|
FILEOS 0x40004L
|
||||||
|
FILETYPE 0x2L
|
||||||
|
FILESUBTYPE 0x0L
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", RES_STR_COMPANY_NAME
|
||||||
|
VALUE "FileDescription", "CSQ Test\0"
|
||||||
|
VALUE "FileVersion", "0.1.4\0"
|
||||||
|
VALUE "InternalName", "csqtest\0"
|
||||||
|
VALUE "LegalCopyright", RES_STR_LEGAL_COPYRIGHT
|
||||||
|
VALUE "OriginalFilename", "csqtest.sys\0"
|
||||||
|
VALUE "ProductName", RES_STR_PRODUCT_NAME
|
||||||
|
VALUE "ProductVersion", RES_STR_PRODUCT_VERSION
|
||||||
|
END
|
||||||
|
END
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x409, 1200
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue