NTSTATUS NTAPI IKsAllocator_fnClose( IKsAllocator *iface) { PALLOCATOR This = (PALLOCATOR)CONTAINING_RECORD(iface, ALLOCATOR, lpVtbl); /* FIXME locks */ /* now close allocator */ if (This->Type == ALLOCATOR_CUSTOM) { This->Delete.DefaultDelete(This->u.CustomList); } else if (This->Type == ALLOCATOR_NPAGED_LOOKASIDE) { This->Delete.NPagedPool(&This->u.NPagedList); } else if (This->Type == ALLOCATOR_PAGED_LOOKASIDE) { This->Delete.PagedPool(&This->u.PagedList); } /* free object header */ KsFreeObjectHeader(&This->Header); return STATUS_SUCCESS; }
NTSTATUS NTAPI Dispatch_fnClose( PDEVICE_OBJECT DeviceObject, PIRP Irp) { PIO_STACK_LOCATION IoStack; PDISPATCH_CONTEXT DispatchContext; NTSTATUS Status; // get current irp stack IoStack = IoGetCurrentIrpStackLocation(Irp); // get dispatch context DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; // let IrpTarget handle request Status = DispatchContext->Target->Close(DeviceObject, Irp); if (NT_SUCCESS(Status)) { KsFreeObjectHeader(DispatchContext->ObjectHeader); FreeItem(DispatchContext, TAG_PORTCLASS); } // done return Status; }
/* @implemented */ KSDDKAPI NTSTATUS NTAPI KsCreateDefaultAllocatorEx( IN PIRP Irp, IN PVOID InitializeContext OPTIONAL, IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL, IN PFNKSDEFAULTFREE DefaultFree OPTIONAL, IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL, IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL) { NTSTATUS Status; PKSALLOCATOR_FRAMING AllocatorFraming; PALLOCATOR Allocator; PVOID Ctx; /* first validate connect request */ Status = KsValidateAllocatorCreateRequest(Irp, &AllocatorFraming); if (!NT_SUCCESS(Status)) return STATUS_INVALID_PARAMETER; /* check the valid file alignment */ if (AllocatorFraming->FileAlignment > (PAGE_SIZE-1)) { FreeItem(AllocatorFraming); return STATUS_INVALID_PARAMETER; } /* allocate allocator struct */ Allocator = AllocateItem(NonPagedPool, sizeof(ALLOCATOR)); if (!Allocator) { FreeItem(AllocatorFraming); return STATUS_INSUFFICIENT_RESOURCES; } /* allocate object header */ Status = KsAllocateObjectHeader((KSOBJECT_HEADER*)&Allocator->Header, 0, NULL, Irp, &DispatchTable); if (!NT_SUCCESS(Status)) { FreeItem(AllocatorFraming); FreeItem(Allocator); return Status; } /* set allocator type in object header */ Allocator->lpVtbl = &vt_IKsAllocator; Allocator->Header->Unknown = (PUNKNOWN)&Allocator->lpVtbl; Allocator->ref = 1; if (DefaultAllocate) { /* use external allocator */ Allocator->Type = ALLOCATOR_CUSTOM; Allocator->Allocate.DefaultAllocate = DefaultAllocate; Allocator->Free.DefaultFree = DefaultFree; Allocator->Delete.DefaultDelete = DeleteAllocator; Ctx = InitializeAllocator(InitializeContext, AllocatorFraming, &Allocator->u.CustomList); /* check for success */ if (!Ctx) { KsFreeObjectHeader(Allocator->Header); FreeItem(Allocator); return Status; } } else if (AllocatorFraming->PoolType == NonPagedPool) { /* use non-paged pool allocator */ Allocator->Type = ALLOCATOR_NPAGED_LOOKASIDE; Allocator->Allocate.NPagedPool = ExAllocateFromNPagedLookasideList; Allocator->Free.NPagedPool = ExFreeToNPagedLookasideList; Allocator->Delete.NPagedPool = ExDeleteNPagedLookasideList; ExInitializeNPagedLookasideList(&Allocator->u.NPagedList, NULL, NULL, 0, AllocatorFraming->FrameSize, 0, 0); } else if (AllocatorFraming->PoolType == PagedPool) { /* use paged pool allocator */ Allocator->Allocate.PagedPool = ExAllocateFromPagedLookasideList; Allocator->Free.PagedPool = ExFreeToPagedLookasideList; Allocator->Delete.PagedPool = ExDeletePagedLookasideList; Allocator->Type = ALLOCATOR_PAGED_LOOKASIDE; ExInitializePagedLookasideList(&Allocator->u.PagedList, NULL, NULL, 0, AllocatorFraming->FrameSize, 0, 0); } /* backup allocator framing */ RtlMoveMemory(&Allocator->Status.Framing, AllocatorFraming, sizeof(KSALLOCATOR_FRAMING)); FreeItem(AllocatorFraming); return Status; }
NTSTATUS NTAPI DispatchCreateSysAudioPin( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS Status = STATUS_SUCCESS; PIO_STACK_LOCATION IoStack; PKSAUDIO_DEVICE_ENTRY DeviceEntry; PKSPIN_CONNECT Connect; PDISPATCH_CONTEXT DispatchContext; DPRINT("DispatchCreateSysAudioPin entered\n"); /* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); /* sanity checks */ ASSERT(IoStack->FileObject); ASSERT(IoStack->FileObject->RelatedFileObject); ASSERT(IoStack->FileObject->RelatedFileObject->FsContext); /* get current attached virtual device */ DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)IoStack->FileObject->RelatedFileObject->FsContext; /* check for success */ if (!NT_SUCCESS(Status)) { /* failed */ Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } /* get connect details */ Status = GetConnectRequest(Irp, &Connect); /* check for success */ if (!NT_SUCCESS(Status)) { /* failed to obtain connect details */ Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } /* allocate dispatch context */ DispatchContext = AllocateItem(NonPagedPool, sizeof(DISPATCH_CONTEXT)); if (!DispatchContext) { /* failed */ Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INSUFFICIENT_RESOURCES; } /* zero dispatch context */ RtlZeroMemory(DispatchContext, sizeof(DISPATCH_CONTEXT)); /* allocate object header */ Status = KsAllocateObjectHeader(&DispatchContext->ObjectHeader, 0, NULL, Irp, &PinTable); if (!NT_SUCCESS(Status)) { /* failed */ FreeItem(DispatchContext); Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } /* now instantiate the pins */ Status = InstantiatePins(DeviceEntry, Connect, DispatchContext, (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension); if (!NT_SUCCESS(Status)) { /* failed */ KsFreeObjectHeader(DispatchContext->ObjectHeader); FreeItem(DispatchContext); } else { /* store dispatch context */ IoStack->FileObject->FsContext = (PVOID)DispatchContext; } /* FIXME create items for clocks / allocators */ Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; }