NTSTATUS LklDispatchRequest(PIRPCONTEXT irp_context) { ASSERT(irp_context); ASSERT((irp_context->id.type == IRP_CONTEXT) && (irp_context->id.size == sizeof(IRPCONTEXT))); switch (irp_context->major_function) { case IRP_MJ_CREATE: return CommonCreate(irp_context, irp_context->irp); case IRP_MJ_CLEANUP: return CommonCleanup(irp_context, irp_context->irp); case IRP_MJ_CLOSE: return CommonClose(irp_context, irp_context->irp); case IRP_MJ_DIRECTORY_CONTROL: return CommonDirectoryControl(irp_context, irp_context->irp); case IRP_MJ_LOCK_CONTROL: default: LklCompleteRequest(irp_context->irp, STATUS_INVALID_DEVICE_REQUEST); FreeIrpContext(irp_context); } return STATUS_NOT_IMPLEMENTED; }
static private_sys_t* CommonOpen( vlc_object_t* p_obj, stream_t* source ) { if( probe( source ) ) return NULL; private_sys_t* p_sys = setup( p_obj, source ); if( p_sys == NULL ) return NULL; if( archive_init( p_sys, source ) ) { CommonClose( p_sys ); return NULL; } return p_sys; }
static int ExtractorOpen( vlc_object_t* p_obj ) { stream_extractor_t* p_extractor = (void*)p_obj; private_sys_t* p_sys = CommonOpen( p_obj, p_extractor->source ); if( p_sys == NULL ) return VLC_EGENERIC; if( archive_seek_subentry( p_sys, p_extractor->identifier ) ) { CommonClose( p_sys ); return VLC_EGENERIC; } p_extractor->p_sys = p_sys; p_extractor->pf_read = Read; p_extractor->pf_control = Control; p_extractor->pf_seek = Seek; return VLC_SUCCESS; }
static void ExtractorClose( vlc_object_t* p_obj ) { stream_extractor_t* p_extractor = (void*)p_obj; return CommonClose( p_extractor->p_sys ); }
static void DirectoryClose( vlc_object_t* p_obj ) { stream_directory_t* p_directory = (void*)p_obj; return CommonClose( p_directory->p_sys ); }