/***************************************************************************** * minihelp.c - services provided by the port class driver to miniports ***************************************************************************** * Copyright (c) 1996-2000 Microsoft Corporation. All rights reserved. * * 11/8/96 Dale Sather * */ #define _NO_SYS_GUID_OPERATOR_EQ_ // So operator == / != in guiddef.h isn't included #include "private.h" #include #ifdef DRM_PORTCLS #include #endif // DRM_PORTCLS NTSTATUS GetClassInfo ( IN REFCLSID ClassId, OUT PFNCREATEINSTANCE * Create ); #pragma code_seg("PAGE") /***************************************************************************** * PcNewPort() ***************************************************************************** * Creates an instance of a port driver. */ PORTCLASSAPI NTSTATUS NTAPI PcNewPort ( OUT PPORT * OutPort, IN REFCLSID ClassId ) { PAGED_CODE(); ASSERT(OutPort); // // Validate Parameters. // if (NULL == OutPort) { _DbgPrintF(DEBUGLVL_TERSE, ("PcNewPort : Invalid Parameter.")); return STATUS_INVALID_PARAMETER; } PUNKNOWN unknown; PFNCREATEINSTANCE create; NTSTATUS ntStatus = GetClassInfo ( ClassId, &create ); if (NT_SUCCESS(ntStatus)) { ntStatus = create ( &unknown, ClassId, NULL, NonPagedPool ); if (NT_SUCCESS(ntStatus)) { ntStatus = unknown->QueryInterface(IID_IPort,(PVOID *) OutPort); unknown->Release(); } } else { ntStatus = KoCreateInstance ( ClassId, NULL, CLSCTX_KERNEL_SERVER, IID_IPort, (PVOID *) OutPort ); } return ntStatus; } /***************************************************************************** * PcNewMiniport() ***************************************************************************** * Creates an instance of a miniport driver. */ PORTCLASSAPI NTSTATUS NTAPI PcNewMiniport ( OUT PMINIPORT * OutMiniport, IN REFCLSID ClassId ) { PAGED_CODE(); ASSERT(OutMiniport); // // Validate Parameters. // if (NULL == OutMiniport) { _DbgPrintF(DEBUGLVL_TERSE, ("PcNewMiniport : Invalid Parameter.")); return STATUS_INVALID_PARAMETER; } PUNKNOWN unknown; PFNCREATEINSTANCE create; NTSTATUS ntStatus = GetClassInfo ( ClassId, &create ); if (NT_SUCCESS(ntStatus)) { ntStatus = create ( &unknown, ClassId, NULL, NonPagedPool ); if (NT_SUCCESS(ntStatus)) { ntStatus = unknown->QueryInterface ( IID_IMiniport, (PVOID *) OutMiniport ); unknown->Release(); } } else { ntStatus = KoCreateInstance ( ClassId, NULL, CLSCTX_KERNEL_SERVER, IID_IMiniport, (PVOID *) OutMiniport ); } return ntStatus; } #pragma code_seg() /***************************************************************************** * PcGetTimeInterval ***************************************************************************** * Gets the system time interval */ PORTCLASSAPI ULONGLONG NTAPI PcGetTimeInterval ( IN ULONGLONG Since ) { LARGE_INTEGER deltaTime; KeQuerySystemTime(&deltaTime); return deltaTime.QuadPart - Since; } #pragma code_seg("PAGE") #ifdef DRM_PORTCLS PORTCLASSAPI NTSTATUS NTAPI PcAddContentHandlers(IN ULONG ContentId,IN PVOID* paHandlers,IN ULONG NumHandlers) { PAGED_CODE(); return DrmAddContentHandlers(ContentId,paHandlers,NumHandlers); } PORTCLASSAPI NTSTATUS NTAPI PcCreateContentMixed(IN PULONG paContentId,IN ULONG cContentId,OUT PULONG pMixedContentId) { PAGED_CODE(); return DrmCreateContentMixed(paContentId,cContentId,pMixedContentId); } PORTCLASSAPI NTSTATUS NTAPI PcDestroyContent(IN ULONG ContentId) { PAGED_CODE(); return DrmDestroyContent(ContentId); } PORTCLASSAPI NTSTATUS NTAPI PcForwardContentToDeviceObject(IN ULONG ContentId,IN PVOID Reserved,IN PCDRMFORWARD DrmForward) { PAGED_CODE(); return DrmForwardContentToDeviceObject(ContentId,Reserved,DrmForward); } PORTCLASSAPI NTSTATUS NTAPI PcForwardContentToFileObject(IN ULONG ContentId,IN PFILE_OBJECT FileObject) { PAGED_CODE(); return DrmForwardContentToFileObject(ContentId,FileObject); } PORTCLASSAPI NTSTATUS NTAPI PcForwardContentToInterface(IN ULONG ContentId, IN PUNKNOWN pUnknown, IN ULONG NumMethods) { PAGED_CODE(); return DrmForwardContentToInterface(ContentId,pUnknown,NumMethods); } PORTCLASSAPI NTSTATUS NTAPI PcGetContentRights(IN ULONG ContentId,OUT PDRMRIGHTS DrmRights) { PAGED_CODE(); return DrmGetContentRights(ContentId,DrmRights); } #else // DRM_PORTCLS PORTCLASSAPI NTSTATUS NTAPI PcAddContentHandlers(IN ULONG ContentId,IN PVOID* paHandlers,IN ULONG NumHandlers) { PAGED_CODE(); return STATUS_UNSUCCESSFUL; } PORTCLASSAPI NTSTATUS NTAPI PcCreateContentMixed(IN PULONG paContentId, IN ULONG cContentId, OUT PULONG pMixedContentId) { PAGED_CODE(); return STATUS_UNSUCCESSFUL; } PORTCLASSAPI NTSTATUS NTAPI PcDestroyContent(IN ULONG ContentId) { PAGED_CODE(); return STATUS_UNSUCCESSFUL; } PORTCLASSAPI NTSTATUS NTAPI PcForwardContentToDeviceObject(IN ULONG ContentId,IN PVOID Reserved,IN PCDRMFORWARD DrmForward) { PAGED_CODE(); return STATUS_UNSUCCESSFUL; } PORTCLASSAPI NTSTATUS NTAPI PcForwardContentToFileObject(IN ULONG ContentId,IN PFILE_OBJECT FileObject) { PAGED_CODE(); return STATUS_UNSUCCESSFUL; } PORTCLASSAPI NTSTATUS NTAPI PcForwardContentToInterface(IN ULONG ContentId, IN PUNKNOWN pUnknown, IN ULONG NumMethods) { PAGED_CODE(); return STATUS_UNSUCCESSFUL; } PORTCLASSAPI NTSTATUS NTAPI PcGetContentRights(IN ULONG ContentId,OUT PDRMRIGHTS DrmRights) { PAGED_CODE(); return STATUS_UNSUCCESSFUL; } #endif // DRM_PORTCLS