- Implement KsCreateAllocator, KsRegisterWorker, KsUnregisterWorker, KsRegisterCountedWorker, KsDecrementCountedWorker, KsIncrementCountedWorker, KsQueueWorkItem

svn path=/trunk/; revision=38115
This commit is contained in:
Johannes Anderwald 2008-12-16 13:19:53 +00:00
parent 4c0f9b5052
commit 7f7f904854
3 changed files with 146 additions and 24 deletions

View file

@ -20,14 +20,13 @@ KsCreateAllocator(
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI NTSTATUS NTAPI KSDDKAPI NTSTATUS NTAPI
KsCreateDefaultAllocator( KsCreateDefaultAllocator(
IN PIRP Irp) IN PIRP Irp)
{ {
UNIMPLEMENTED; return KsCreateDefaultAllocatorEx(Irp, NULL, NULL, NULL, NULL, NULL);
return STATUS_UNSUCCESSFUL;
} }
/* /*
@ -54,7 +53,14 @@ KsCreateDefaultAllocatorEx(
IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL, IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL) IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL)
{ {
UNIMPLEMENTED; NTSTATUS Status;
PKSALLOCATOR_FRAMING AllocatorFraming;
Status = KsValidateAllocatorCreateRequest(Irp, &AllocatorFraming);
if (!NT_SUCCESS(Status))
return STATUS_INVALID_PARAMETER;
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }

View file

@ -6,6 +6,7 @@
<include base="ks">../include</include> <include base="ks">../include</include>
<importlibrary definition="ks.spec" /> <importlibrary definition="ks.spec" />
<library>ntoskrnl</library> <library>ntoskrnl</library>
<library>hal</library>
<define name="BUILDING_KS" /> <define name="BUILDING_KS" />
<define name="_NTDDK_" /> <define name="_NTDDK_" />
<define name="_COMDDK_" /> <define name="_COMDDK_" />

View file

@ -6,30 +6,87 @@
#include <debug.h> #include <debug.h>
#include <ks.h> #include <ks.h>
typedef struct
{
KEVENT Event;
KSPIN_LOCK Lock;
WORK_QUEUE_TYPE Type;
LONG Counter;
PWORK_QUEUE_ITEM WorkItem;
ULONG WorkItemActive;
ULONG DeleteInProgress;
}KS_WORKER;
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI NTSTATUS NTAPI KSDDKAPI
NTSTATUS
NTAPI
KsRegisterWorker( KsRegisterWorker(
IN WORK_QUEUE_TYPE WorkQueueType, IN WORK_QUEUE_TYPE WorkQueueType,
OUT PKSWORKER* Worker) OUT PKSWORKER* Worker)
{ {
KS_WORKER * KsWorker;
UNIMPLEMENTED; UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL;
if (WorkQueueType != CriticalWorkQueue &&
WorkQueueType != DelayedWorkQueue &&
WorkQueueType != HyperCriticalWorkQueue)
{
return STATUS_INVALID_PARAMETER;
}
KsWorker = ExAllocatePoolWithTag(NonPagedPool, sizeof(KS_WORKER), 0);
if (!KsWorker)
return STATUS_INSUFFICIENT_RESOURCES;
KsWorker->Type = WorkQueueType;
KsWorker->Counter = 0;
KsWorker->WorkItemActive = 0;
KsWorker->WorkItem = NULL;
KsWorker->DeleteInProgress = TRUE;
KeInitializeSpinLock(&KsWorker->Lock);
KeInitializeEvent(&KsWorker->Event, NotificationEvent, FALSE);
*Worker = KsWorker;
return STATUS_SUCCESS;
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI VOID NTAPI KSDDKAPI VOID NTAPI
KsUnregisterWorker( KsUnregisterWorker(
IN PKSWORKER Worker) IN PKSWORKER Worker)
{ {
UNIMPLEMENTED; KS_WORKER * KsWorker;
KIRQL OldIrql;
ULONG bWait = FALSE;
if (!Worker)
return;
KsWorker = (KS_WORKER *)Worker;
KsWorker->DeleteInProgress = TRUE;
if (KsWorker->WorkItemActive)
{
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
KeWaitForSingleObject(&KsWorker->Event, Executive, KernelMode, FALSE, NULL);
}
else
{
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
}
ExFreePoolWithTag(KsWorker, 0);
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI NTSTATUS NTAPI KSDDKAPI NTSTATUS NTAPI
KsRegisterCountedWorker( KsRegisterCountedWorker(
@ -37,40 +94,98 @@ KsRegisterCountedWorker(
IN PWORK_QUEUE_ITEM CountedWorkItem, IN PWORK_QUEUE_ITEM CountedWorkItem,
OUT PKSWORKER* Worker) OUT PKSWORKER* Worker)
{ {
UNIMPLEMENTED; NTSTATUS Status;
return STATUS_UNSUCCESSFUL; KS_WORKER * KsWorker;
Status = KsRegisterWorker(WorkQueueType, Worker);
if (NT_SUCCESS(Status))
{
KsWorker = (KS_WORKER *)Worker;
KsWorker->WorkItem = CountedWorkItem;
}
return Status;
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI ULONG NTAPI KSDDKAPI
ULONG
NTAPI
KsDecrementCountedWorker( KsDecrementCountedWorker(
IN PKSWORKER Worker) IN PKSWORKER Worker)
{ {
UNIMPLEMENTED; KS_WORKER * KsWorker;
return 0; LONG Counter;
if (!Worker)
return STATUS_INVALID_PARAMETER;
KsWorker = (KS_WORKER *)Worker;
Counter = InterlockedDecrement(&KsWorker->Counter);
if (KsWorker->DeleteInProgress)
{
/* signal that we are done */
KeSetEvent(&KsWorker->Event, 0, 0);
}
return Counter;
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI ULONG NTAPI KSDDKAPI
ULONG
NTAPI
KsIncrementCountedWorker( KsIncrementCountedWorker(
IN PKSWORKER Worker) IN PKSWORKER Worker)
{ {
UNIMPLEMENTED; KS_WORKER * KsWorker;
return 0; LONG Counter;
if (!Worker)
return STATUS_INVALID_PARAMETER;
KsWorker = (KS_WORKER *)Worker;
Counter = InterlockedIncrement(&KsWorker->Counter);
if (Counter == 1)
{
KsQueueWorkItem(Worker, KsWorker->WorkItem);
}
return Counter;
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI NTSTATUS NTAPI KSDDKAPI
NTSTATUS
NTAPI
KsQueueWorkItem( KsQueueWorkItem(
IN PKSWORKER Worker, IN PKSWORKER Worker,
IN PWORK_QUEUE_ITEM WorkItem) IN PWORK_QUEUE_ITEM WorkItem)
{ {
UNIMPLEMENTED; KS_WORKER * KsWorker;
return STATUS_UNSUCCESSFUL; KIRQL OldIrql;
NTSTATUS Status = STATUS_SUCCESS;
if (!Worker || !WorkItem)
return STATUS_INVALID_PARAMETER;
KsWorker = (KS_WORKER *)Worker;
KeAcquireSpinLock(&KsWorker->Lock, &OldIrql);
if (!KsWorker->DeleteInProgress)
{
ExQueueWorkItem(WorkItem, KsWorker->Type);
Status = STATUS_UNSUCCESSFUL;
}
KeReleaseSpinLock(&KsWorker->Lock, OldIrql);
return Status;
} }