//*************************************************************************** // // FileName: // $Workfile: DVDINIT.CPP $ // // Author: // TOSHIBA [PCS](PSY) Satoshi Watanabe // Copyright (c) 1998 TOSHIBA CORPORATION // // Description: // 1998.05.27 dvdwdm.cpp から分割 // //*************************************************************************** // $Header: /DVD Drivers/ZIVA2PC.WDM/DVDINIT.CPP 29 99/07/14 10:31 K-ogi $ // $Modtime: 99/07/07 13:08 $ // $Nokeywords:$ //*************************************************************************** #include "includes.h" #include "hal.h" #include "wdmkserv.h" #include "mpevent.h" #include "classlib.h" #include "ctime.h" #include "schdat.h" #include "ccque.h" #include "ctvctrl.h" #include "hlight.h" #include "hwdevex.h" #include "wdmbuff.h" #include "dvdinit.h" #include "dvdwdm.h" #include "wrapdef.h" #include "ssif.h" //--- 98.05.27 S.Watanabe BYTE PaletteY[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfd, 0xfd, }; BYTE PaletteCb[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x63, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x84, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc3, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe2, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfd, 0xfd, }; BYTE PaletteCr[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x63, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x84, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc3, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe2, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfd, 0xfd, }; //--- End. NTSTATUS GetConfigValue( IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext ); //////////////////////////////////////////////////////////////////////////// // // Public Functions // //////////////////////////////////////////////////////////////////////////// extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { // DBG_BREAK(); HW_INITIALIZATION_DATA HwInitData; // 1998.9.24 K.Ishizaki RTL_QUERY_REGISTRY_TABLE queryRegistryTable[NUMBER_OF_REGISTRY_PARAMETERS + 1]; PWSTR parameterPath = NULL; ULONG lengthOfPath = 0; UNICODE_STRING parameters; ULONG zero = 0; ULONG breakOnEntry = 0; RtlInitUnicodeString(¶meters, L"\\Parameters"); lengthOfPath = RegistryPath->Length + parameters.Length + sizeof(WCHAR); parameterPath = (PWSTR)ExAllocatePool(NonPagedPool, lengthOfPath); if (parameterPath) { // Construct a path string. RtlZeroMemory(parameterPath, lengthOfPath); RtlCopyMemory(parameterPath, RegistryPath->Buffer, RegistryPath->Length); RtlCopyMemory((BYTE *)parameterPath + RegistryPath->Length, parameters.Buffer, parameters.Length); // Query registry values. RtlZeroMemory(queryRegistryTable, sizeof(queryRegistryTable)); queryRegistryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; queryRegistryTable[0].Name = L"EnablePrintf"; queryRegistryTable[0].EntryContext = &Dbg_Printf_Enable; queryRegistryTable[0].DefaultType = REG_DWORD; queryRegistryTable[0].DefaultData = &zero; queryRegistryTable[0].DefaultLength = sizeof(ULONG); queryRegistryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; queryRegistryTable[1].Name = L"EnableBreak"; queryRegistryTable[1].EntryContext = &Dbg_Break_Enable; queryRegistryTable[1].DefaultType = REG_DWORD; queryRegistryTable[1].DefaultData = &zero; queryRegistryTable[1].DefaultLength = sizeof(ULONG); queryRegistryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT; queryRegistryTable[2].Name = L"DebugLevel"; queryRegistryTable[2].EntryContext = &Dbg_Print_Level; queryRegistryTable[2].DefaultType = REG_DWORD; queryRegistryTable[2].DefaultData = &zero; queryRegistryTable[2].DefaultLength = sizeof(ULONG); queryRegistryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; queryRegistryTable[3].Name = L"DebugFlags"; queryRegistryTable[3].EntryContext = &Dbg_Print_Flags; queryRegistryTable[3].DefaultType = REG_DWORD; queryRegistryTable[3].DefaultData = &zero; queryRegistryTable[3].DefaultLength = sizeof(ULONG); queryRegistryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; queryRegistryTable[4].Name = L"BreakOnEntry"; queryRegistryTable[4].EntryContext = &breakOnEntry; queryRegistryTable[4].DefaultType = REG_DWORD; queryRegistryTable[4].DefaultData = &zero; queryRegistryTable[4].DefaultLength = sizeof(ULONG); #ifndef TVALD queryRegistryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; queryRegistryTable[5].Name = L"EnableTvald"; queryRegistryTable[5].EntryContext = &Dbg_Tvald; queryRegistryTable[5].DefaultType = REG_DWORD; queryRegistryTable[5].DefaultData = &zero; queryRegistryTable[5].DefaultLength = sizeof(ULONG); #endif TVALD RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, parameterPath, queryRegistryTable, NULL, NULL); ExFreePool(parameterPath); } if (breakOnEntry) { __asm { int 3 } } // END DBG_PRINTF( ("DVDWDM:TOSDVD02 DriverEntry\n\r") ); RtlZeroMemory( &HwInitData, sizeof(HW_INITIALIZATION_DATA) ); HwInitData.HwInitializationDataSize = sizeof( HwInitData ); HwInitData.HwInterrupt = (PHW_INTERRUPT)HwInterrupt; HwInitData.HwReceivePacket = AdapterReceivePacket; HwInitData.HwCancelPacket = AdapterCancelPacket; HwInitData.HwRequestTimeoutHandler = AdapterTimeoutPacket; HwInitData.DeviceExtensionSize = sizeof( HW_DEVICE_EXTENSION ); HwInitData.PerRequestExtensionSize = sizeof( SRB_EXTENSION ); HwInitData.PerStreamExtensionSize = sizeof( STREAMEX ); HwInitData.FilterInstanceExtensionSize = 0; HwInitData.BusMasterDMA = TRUE; HwInitData.Dma24BitAddresses = FALSE; HwInitData.BufferAlignment = 4; HwInitData.TurnOffSynchronization = FALSE; HwInitData.DmaBufferSize = DMASIZE; return( StreamClassRegisterMinidriver( (PVOID)DriverObject, (PVOID)RegistryPath, &HwInitData ) ); } // Quiet compiler on bogus code: should use placement operator new instead #pragma warning(push) #pragma warning(disable:4701) // Set vtbl into HW_DEVICE_EXTENSION. BOOL InitialHwDevExt( PHW_DEVICE_EXTENSION pHwDevExt ) { CMPEGBoardHAL temp1; CMPEGBoard temp2; CMPEGBoardState temp3; CDVDStream temp4; CTransfer temp5; CWDMKernelService temp6; CDataXferEvent temp7; CTickTime pttime; #ifdef REARRANGEMENT CScheduleData pschd; #endif REARRANGEMENT CCQueue temp8; CUserDataEvent temp9; CVSyncEvent tempa; CTVControl tempb; HlightControl tempc; #ifndef REARRANGEMENT CScheduleData *pschd = new CScheduleData; #endif REARRANGEMENT pHwDevExt->m_InitComplete = FALSE; RtlCopyMemory( &(pHwDevExt->mphal), &temp1, sizeof(CMPEGBoardHAL) ); RtlCopyMemory( &(pHwDevExt->mpboard), &temp2, sizeof(CMPEGBoard) ); RtlCopyMemory( &(pHwDevExt->mpbstate), &temp3, sizeof(CMPEGBoardState) ); RtlCopyMemory( &(pHwDevExt->dvdstrm), &temp4, sizeof(CDVDStream) ); RtlCopyMemory( &(pHwDevExt->transfer), &temp5, sizeof(CTransfer) ); RtlCopyMemory( &(pHwDevExt->kserv), &temp6, sizeof(CWDMKernelService) ); RtlCopyMemory( &(pHwDevExt->senddata), &temp7, sizeof(CDataXferEvent) ); RtlCopyMemory( &(pHwDevExt->ticktime), &pttime, sizeof(CTickTime) ); #ifndef REARRANGEMENT RtlCopyMemory( &(pHwDevExt->scheduler), pschd, sizeof(CScheduleData) ); #else RtlCopyMemory( &(pHwDevExt->scheduler), &pschd, sizeof(CScheduleData) ); #endif REARRANGEMENT RtlCopyMemory( &(pHwDevExt->ccque), &temp8, sizeof(CCQueue) ); RtlCopyMemory( &(pHwDevExt->userdata), &temp9, sizeof(CUserDataEvent) ); RtlCopyMemory( &(pHwDevExt->vsync), &tempa, sizeof(CVSyncEvent) ); RtlCopyMemory( &(pHwDevExt->tvctrl), &tempb, sizeof(CTVControl) ); RtlCopyMemory( &(pHwDevExt->m_HlightControl), &tempc, sizeof(HlightControl) ); #ifndef REARRANGEMENT delete pschd; #endif REARRANGEMENT return TRUE; } #pragma warning(pop) BOOL GetPCIConfigSpace( IN PHW_STREAM_REQUEST_BLOCK pSrb ) { PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo; PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)ConfigInfo->HwDeviceExtension; DBG_PRINTF( ("DVDWDM:HeDevExt=%08x\n\r", pHwDevExt ) ); if( !StreamClassReadWriteConfig( pSrb->HwDeviceExtension, TRUE, (PVOID)&pHwDevExt->PciConfigSpace, 0, 64 ) ){ // Read DBG_PRINTF( ( "DVDWDM:No PCI ConfigArea!!\n\r") ); DBG_BREAK(); return( FALSE ); }else{ ULONG i, j; for( i=0; i<64; ){ DBG_PRINTF( ( "DVDWDM:PCI Data: ") ); for( j=0;j<8 && i<64; j++,i++ ){ DBG_PRINTF( ( "0x%02x ", (UCHAR)*(((PUCHAR)&pHwDevExt->PciConfigSpace)+i)) ); } DBG_PRINTF( ( "\n\r") ); } } DWORD Id = *(DWORD *)(&pHwDevExt->PciConfigSpace); pHwDevExt->kserv.InitConfig( Id ); return( TRUE ); } BOOL SetInitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb ) { PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo; PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)(ConfigInfo->HwDeviceExtension); // NTSTATUS Status; BOOL bTVct=FALSE; if( ConfigInfo->NumberOfAccessRanges<1 ){ DBG_PRINTF( ( "DVDWDM:Illegal Config info\n\r") ); DBG_BREAK(); return( FALSE ); } // Debug Dump ConfigInfo DBG_PRINTF( ( "DVDWDM: Port = 0x%04x\n\r", ConfigInfo->AccessRanges[0].RangeStart.LowPart) ); DBG_PRINTF( ( "DVDWDM: Length = 0x%04x\n\r", ConfigInfo->AccessRanges[0].RangeLength) ); DBG_PRINTF( ( "DVDWDM: IRQ = 0x%04x\n\r", ConfigInfo->BusInterruptLevel) ); DBG_PRINTF( ( "DVDWDM: Vector = 0x%04x\n\r", ConfigInfo->BusInterruptVector) ); DBG_PRINTF( ( "DVDWDM: DMA = 0x%04x\n\r", ConfigInfo->DmaChannel) ); // Initialize the size of stream descriptor information. ConfigInfo->StreamDescriptorSize = STREAMNUM * sizeof(HW_STREAM_INFORMATION) + sizeof(HW_STREAM_HEADER); pHwDevExt->ioBaseLocal = (PUCHAR)ConfigInfo->AccessRanges[0].RangeStart.LowPart; pHwDevExt->Irq = ConfigInfo->BusInterruptLevel; DBG_PRINTF( ("DVDWDM:I/O-Base = %08x\n\r", pHwDevExt->ioBaseLocal ) ); DBG_PRINTF( ("DVDWDM:Irq = %08x\n\r", pHwDevExt->Irq ) ); /********* 98.12.22 H.Yagi // Read Machine information from Registry. UNICODE_STRING RegPath; UNICODE_STRING IdString; ANSI_STRING AnsiRegPath; ANSI_STRING AnsiIdString; // BYTE IdByte[100]; RTL_QUERY_REGISTRY_TABLE Table[2]; // DBG_BREAK(); RtlInitUnicodeString( &RegPath, L"\\Registry\\Machine\\Enum\\Root\\*PNP0C01\\0000"); RtlInitAnsiString( &AnsiRegPath, "\\Registry\\Machine\\Enum\\Root\\*PNP0C01\\0000"); IdString.Length = 0; IdString.MaximumLength = 200; IdString.Buffer = (PWSTR)ExAllocatePool( PagedPool, IdString.MaximumLength); if( IdString.Buffer==NULL ){ DBG_PRINTF( ("DVDINIT:Mem Alloc Error\n\r") ); DBG_BREAK(); } AnsiIdString.Length = 0; AnsiIdString.MaximumLength = 100; AnsiIdString.Buffer = (PCHAR)ExAllocatePool( PagedPool, IdString.MaximumLength); if( AnsiIdString.Buffer==NULL ){ DBG_PRINTF( ("DVDINIT:Mem Alloc Error\n\r") ); DBG_BREAK(); } RtlZeroMemory( Table, sizeof(Table) ); Table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; Table[0].Name = L"BIOSVersion"; Table[0].EntryContext = &IdString; Table[0].DefaultType = REG_SZ; Table[0].DefaultData = &RegPath; Table[0].DefaultLength = 0; Status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, RegPath.Buffer, Table, NULL, NULL ); DBG_PRINTF( ("DVDINIT:Machine ID Check Status = 0x%08x\n\r", Status ) ); if( NT_SUCCESS( Status ) ){ RtlUnicodeStringToAnsiString( &AnsiIdString, &IdString, FALSE ); // DBG_PRINTF( ("DVDINIT:Machine ID(Unicode) = %s\n\r", IdString.Buffer ) ); DBG_PRINTF( ("DVDINIT:Machine ID(Ansi) = %s\n\r", AnsiIdString.Buffer ) ); }else{ // check NT5 Registry RtlInitUnicodeString( &RegPath, L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System"); RtlZeroMemory( Table, sizeof(Table) ); Table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; Table[0].Name = L"SystemBiosVersion"; Table[0].EntryContext = &IdString; Table[0].DefaultType = REG_MULTI_SZ; Table[0].DefaultData = &RegPath; Table[0].DefaultLength = 0; Status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, RegPath.Buffer, Table, NULL, NULL ); DBG_PRINTF( ("DVDINIT:Binary Check Status = 0x%08x\n\r", Status ) ); if( NT_SUCCESS( Status ) ){ RtlUnicodeStringToAnsiString( &AnsiIdString, &IdString, FALSE ); // DBG_PRINTF( ("DVDINIT:Machine ID(Unicode) = %s\n\r", IdString.Buffer ) ); DBG_PRINTF( ("DVDINIT:Machine ID(Ansi) = %s\n\r", AnsiIdString.Buffer ) ); }else{ DBG_PRINTF( ("DVDINIT:Machine ID Read Error!\n\r") ); DBG_BREAK(); } } ***********/ // Not checking Registry BIOSVersion, so we deal with Portege7000 as Tecra8000. // Pass the string 'TECRA' to KernelService object. ANSI_STRING AnsiIdString; AnsiIdString.Buffer="TECRA\0"; // if( !( pHwDevExt->mpboard.Init() ) || !( pHwDevExt->mpbstate.Init() ) || !( pHwDevExt->dvdstrm.Init() ) || !( pHwDevExt->transfer.Init() ) ){ DBG_PRINTF( ("DVDWDM:Initialize objects error!\n\r") ); // DBG_BREAK(); return( FALSE ); } pHwDevExt->mphal.Init( WrapperType_WDM ); // WrapperType pHwDevExt->kserv.Init( (DWORD)(pHwDevExt->ioBaseLocal), pHwDevExt, AnsiIdString.Buffer ); // Setup kernel service object to hal object. pHwDevExt->mphal.SetKernelService( &(pHwDevExt->kserv ) ); // Setup CMPEGBoard object. pHwDevExt->mpboard.SetHALObjectInterface( &(pHwDevExt->mphal) ); pHwDevExt->mpboard.AddStreamObjectInterface( &(pHwDevExt->dvdstrm) ); // Setup CBaseStream objects. pHwDevExt->dvdstrm.SetStateObject( &(pHwDevExt->mpbstate) ); pHwDevExt->dvdstrm.SetTransferObject( &(pHwDevExt->transfer) ); // Register data xfer event object to transfer object. pHwDevExt->transfer.SetSink( &(pHwDevExt->senddata) ); // Register vsync event object to transfer object. pHwDevExt->vsync.Init( pHwDevExt ); // pHwDevExt->mphal.SetSinkWrapper( &(pHwDevExt->vsync) ); // commented out this line, // SetsinkWrapper and UnsetSinkWrapper // dynamically, cause of MS bug? // stream State init pHwDevExt->StreamState = StreamState_Off; // Clear CppFlagCount 99.01.07 H.Yagi pHwDevExt->CppFlagCount = 0; // Ask and Set DMA buffer address & size to HAL. // DBG_BREAK(); STREAM_PHYSICAL_ADDRESS adr; DWORD size, flag; DWORD PAdr, LAdr; ULONG Length; pHwDevExt->mphal.QueryDMABufferSize( &size, &flag ); if( size>DMASIZE ){ DBG_PRINTF( ("DVDWDM:Not enough DMA memory\n\r") ); DBG_BREAK(); return( FALSE); } if( size!=0 ){ LAdr = (DWORD)StreamClassGetDmaBuffer( pHwDevExt ); adr = StreamClassGetPhysicalAddress( pHwDevExt, NULL, (PVOID)LAdr, DmaBuffer, &Length ); PAdr = (DWORD)adr.LowPart; pHwDevExt->mphal.SetDMABuffer( LAdr, PAdr ); } bTVct = pHwDevExt->tvctrl.Initialize( ); pHwDevExt->m_bTVct = bTVct; pHwDevExt->m_HlightControl.Init( pHwDevExt ); /************** 98.12.22 H.Yagi if( IdString.Buffer!=NULL){ ExFreePool( IdString.Buffer ); } if( AnsiIdString.Buffer!=NULL){ ExFreePool( AnsiIdString.Buffer ); } *********************/ pHwDevExt->m_InitComplete = TRUE; return( TRUE ); } BOOL HwInitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb ) { HALTYPE HType; // add by H.Yagi 1999.04.21 PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)(pSrb->HwDeviceExtension); // No procedure in this routine, because I will set PowerOn to ZiVA // when Video stream is opend. // Now I Check Vendr-ID & Device-ID using kserv method. // Vender-ID pHwDevExt->kserv.GetPCIConfigData( 0x00, &(pHwDevExt->VenderID) ); // Device-ID pHwDevExt->kserv.GetPCIConfigData( 0x02, &(pHwDevExt->DeviceID) ); // Sub Vender-ID pHwDevExt->kserv.GetPCIConfigData( 0x2C, &(pHwDevExt->SubVenderID) ); // Sub Device-ID pHwDevExt->kserv.GetPCIConfigData( 0x2E, &(pHwDevExt->SubDeviceID) ); DBG_PRINTF( ("DVDWDM:Vender ID = 0x%04x\n\r", pHwDevExt->VenderID ) ); DBG_PRINTF( ("DVDWDM:Sub-Vender ID = 0x%04x\n\r", pHwDevExt->SubVenderID ) ); DBG_PRINTF( ("DVDWDM:Device ID = 0x%04x\n\r", pHwDevExt->DeviceID ) ); DBG_PRINTF( ("DVDWDM:Sub-Device ID = 0x%04x\n\r", pHwDevExt->SubDeviceID ) ); pHwDevExt->m_PCID = PC_TECRA750; if( (pHwDevExt->VenderID==0x1179) && (pHwDevExt->DeviceID==0x0407) ){ switch( pHwDevExt->SubDeviceID ){ case 0x0001: pHwDevExt->m_PCID = PC_TECRA750; break; case 0x0003: pHwDevExt->m_PCID = PC_TECRA780; break; } }else if( (pHwDevExt->VenderID==0x123f) && (pHwDevExt->DeviceID==0x8888) ){ switch( pHwDevExt->SubDeviceID ){ case 0x0001: pHwDevExt->m_PCID = PC_TECRA8000; break; case 0x0002: pHwDevExt->m_PCID = PC_PORTEGE7000; break; default: pHwDevExt->m_PCID = PC_PORTEGE7000; // PC_TECRA8000 is also OK. break; } } // check HAL Type & driver itself. pHwDevExt->mphal.GetHALType( &HType ); DBG_PRINTF( ("DVDWDM: HALTYPE = %d\n\r", HType ) ); // TECRA750/780 == HalType_ZIVA if( pHwDevExt->m_PCID==PC_TECRA750 || pHwDevExt->m_PCID==PC_TECRA780 ){ DBG_PRINTF( ("DVDWDM: PC is TECRA750/780\n\r" ) ); if( HType!=HalType_ZIVA ){ return( FALSE ); } } // TECRA8000/Portege7000 == HalType_ZIVAPC if( pHwDevExt->m_PCID==PC_PORTEGE7000 || pHwDevExt->m_PCID==PC_TECRA8000 ){ DBG_PRINTF( ("DVDWDM: PC is TECRA8000/Portege70000\n\r" ) ); if( HType!=HalType_ZIVAPC ){ return( FALSE ); } } // This setting is temporary. // Note that this informations must be read from registry!! // But there is no way to get registry information from minidriver. // So, Now I set the default value directry. pHwDevExt->m_AC3LowBoost = 0x80; pHwDevExt->m_AC3HighCut = 0x80; pHwDevExt->m_AC3OperateMode = 0x00; if( !InitialSetting( pSrb ) ){ // Initial setting except return( FALSE ); // H/W default value. } //// Check TVALD.sys is available or not( TECRA8000 or PORTEGE7000 only ). //// If tvald.sys is not available, not start TOSDVD.sys. 99.03.01 #ifndef TVALD if(Dbg_Tvald == 0) { if( (pHwDevExt->m_PCID==PC_TECRA8000) || (pHwDevExt->m_PCID==PC_PORTEGE7000) ) { if( pHwDevExt->m_bTVct==FALSE ){ return( FALSE ); } } } #endif return( TRUE ); } //--- 98.05.27 S.Watanabe NTSTATUS GetConfigValue( IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext ) { NTSTATUS ntStatus = STATUS_SUCCESS; DBG_PRINTF(( "Type 0x%x, Length 0x%x\n\r", ValueType, ValueLength )); switch( ValueType ) { case REG_DWORD: *(PVOID*)EntryContext = *(PVOID*)ValueData; break; case REG_BINARY: RtlCopyMemory( EntryContext, ValueData, ValueLength ); break; default: ntStatus = STATUS_INVALID_PARAMETER; } return ntStatus; } //--- End. BOOL InitialSetting( IN PHW_STREAM_REQUEST_BLOCK pSrb ) { PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)(pSrb->HwDeviceExtension); DWORD AProp; DWORD dProp1, dProp2, dProp3; //--- 99.01.13 S.Watanabe // // Display Device type // // Currently I will set it directly, but I will read this setting // // from registry and user will be able to change this setting in the // // near future. 98.12.23 H.Yagi // pHwDevExt->m_DisplayDevice = DisplayDevice_Wide; // LCD output take priority //--- End. // AC-3 Dynamic Range control AProp = pHwDevExt->m_AC3LowBoost; if( !pHwDevExt->dvdstrm.SetAudioProperty( AudioProperty_AC3DRangeLowBoost, &AProp ) ){ DBG_PRINTF( ("DVDWDM:AC3 Low Boost Error\n\r") ); DBG_BREAK(); return( FALSE ); } AProp = pHwDevExt->m_AC3HighCut; if( !pHwDevExt->dvdstrm.SetAudioProperty( AudioProperty_AC3DRangeHighCut, &AProp ) ){ DBG_PRINTF( ("DVDWDM:AC3 High Cut Error\n\r") ); DBG_BREAK(); return( FALSE ); } // AC-3 Operational mode AProp = pHwDevExt->m_AC3OperateMode; if( !pHwDevExt->dvdstrm.SetAudioProperty( AudioProperty_AC3OperateMode, &AProp ) ){ DBG_PRINTF( ("DVDWDM:AC3 Operate Mode Error\n\r") ); DBG_BREAK(); return( FALSE ); } //--- 98.05.27 S.Watanabe Digital_Palette dp; NTSTATUS status; //--- 99.01.13 S.Watanabe // RTL_QUERY_REGISTRY_TABLE Table[6]; RTL_QUERY_REGISTRY_TABLE Table[7]; //--- End. DWORD TVOut = 0; // 99.02.03 H.Yagi DWORD AudioOut = 0; //--- 99.01.13 S.Watanabe DWORD VOutDev = SSIF_DISPMODE_VGA; //--- End. DWORD defaultTVOut = 0; // 99.02.03 H.Yagi DWORD defaultAudioOut = 0; //--- 99.01.13 S.Watanabe DWORD defaultVOutDev = SSIF_DISPMODE_VGA; //--- End. RtlZeroMemory( Table, sizeof(Table) ); Table[0].Flags = RTL_QUERY_REGISTRY_DIRECT; Table[0].Name = L"AnalogVideoOut"; Table[0].EntryContext = &TVOut; Table[0].DefaultType = REG_DWORD; Table[0].DefaultData = &defaultTVOut; Table[0].DefaultLength = sizeof(DWORD); Table[1].Flags = RTL_QUERY_REGISTRY_DIRECT; Table[1].Name = L"DigitalAudioOut"; Table[1].EntryContext = &AudioOut; Table[1].DefaultType = REG_DWORD; Table[1].DefaultData = &defaultAudioOut; Table[1].DefaultLength = sizeof(DWORD); // DefaultType = REG_BINARY の場合、Flags = RTL_QUERY_REGISTRY_DIRECT で呼び出すと失敗する // GetConfigValue コールバックルーチンを呼び出すようにし自分でデータコピーを行う Table[2].QueryRoutine = GetConfigValue; Table[2].Flags = 0; Table[2].Name = L"PaletteY"; Table[2].EntryContext = PaletteY; Table[2].DefaultType = REG_BINARY; Table[2].DefaultData = PaletteY; Table[2].DefaultLength = sizeof(PaletteY); Table[3].QueryRoutine = GetConfigValue; Table[3].Flags = 0; Table[3].Name = L"PaletteCb"; Table[3].EntryContext = PaletteCb; Table[3].DefaultType = REG_BINARY; Table[3].DefaultData = PaletteCb; Table[3].DefaultLength = sizeof(PaletteCb); Table[4].QueryRoutine = GetConfigValue; Table[4].Flags = 0; Table[4].Name = L"PaletteCr"; Table[4].EntryContext = PaletteCr; Table[4].DefaultType = REG_BINARY; Table[4].DefaultData = PaletteCr; Table[4].DefaultLength = sizeof(PaletteCr); //--- 99.01.13 S.Watanabe Table[5].QueryRoutine = GetConfigValue; Table[5].Flags = 0; Table[5].Name = L"PriorityDisplayMode"; Table[5].EntryContext = &VOutDev; Table[5].DefaultType = REG_DWORD; Table[5].DefaultData = &defaultVOutDev; Table[5].DefaultLength = sizeof(VOutDev); //--- End. // Table[6] はすべて 0、終端 status = RtlQueryRegistryValues( RTL_REGISTRY_SERVICES, REGPATH_FOR_WDM, Table, NULL, NULL ); DBG_PRINTF(( "status : 0x%x\n\r", status )); DBG_PRINTF(( "TVOut : %d, AudioOut : %d\n\r", TVOut, AudioOut )); if( TVOut == 0 ) dProp1 = OutputSource_VGA; else dProp1 = OutputSource_DVD; if( !pHwDevExt->dvdstrm.SetVideoProperty( VideoProperty_OutputSource, &dProp1 ) ) { DBG_PRINTF( ("DVDWDM:Set VideoProperty_OutputSource Error\n\r") ); DBG_BREAK(); return( FALSE ); } pHwDevExt->m_OutputSource = dProp1; if( AudioOut == 2 ) dProp1 = AudioDigitalOut_On; else if( AudioOut == 1 ) dProp1 = AudioDigitalOut_On; else dProp1 = AudioDigitalOut_Off; if( !pHwDevExt->dvdstrm.SetAudioProperty( AudioProperty_DigitalOut, &dProp1 ) ) { DBG_PRINTF( ("DVDWDM:Set AudioProperty_DigitalOut Error\n\r") ); DBG_BREAK(); return( FALSE ); } pHwDevExt->m_AudioDigitalOut = dProp1; if( AudioOut == 2 ) { dProp1 = AudioOut_Decoded; if( !pHwDevExt->dvdstrm.SetAudioProperty( AudioProperty_AudioOut, &dProp1 ) ) { DBG_PRINTF( ("DVDWDM:Set AudioProperty_AudioOut Error\n\r") ); DBG_BREAK(); return( FALSE ); } } else if( AudioOut == 1 ) { dProp1 = AudioOut_Encoded; if( !pHwDevExt->dvdstrm.SetAudioProperty( AudioProperty_AudioOut, &dProp1 ) ) { DBG_PRINTF( ("DVDWDM:Set AudioProperty_AudioOut Error\n\r") ); DBG_BREAK(); return( FALSE ); } } pHwDevExt->m_AudioEncode = dProp1; dp.Select = Video_Palette_Y; dp.pPalette = PaletteY; if( !pHwDevExt->dvdstrm.SetVideoProperty( VideoProperty_DigitalPalette, &dp ) ) { DBG_PRINTF( ("DVDWDM:Set VideoProperty_DigitalPalette(Y) Error\n\r") ); DBG_BREAK(); return( FALSE ); } dp.Select = Video_Palette_Cb; dp.pPalette = PaletteCb; if( !pHwDevExt->dvdstrm.SetVideoProperty( VideoProperty_DigitalPalette, &dp ) ) { DBG_PRINTF( ("DVDWDM:Set VideoProperty_DigitalPalette(Cb) Error\n\r") ); DBG_BREAK(); return( FALSE ); } dp.Select = Video_Palette_Cr; dp.pPalette = PaletteCr; if( !pHwDevExt->dvdstrm.SetVideoProperty( VideoProperty_DigitalPalette, &dp ) ) { DBG_PRINTF( ("DVDWDM:Set VideoProperty_DigitalPalette(Cr) Error\n\r") ); DBG_BREAK(); return( FALSE ); } //--- End. //--- 99.01.13 S.Watanabe if( VOutDev == SSIF_DISPMODE_43TV ) pHwDevExt->m_DisplayDevice = DisplayDevice_NormalTV; else if( VOutDev == SSIF_DISPMODE_169TV ) pHwDevExt->m_DisplayDevice = DisplayDevice_WideTV; else pHwDevExt->m_DisplayDevice = DisplayDevice_VGA; //--- End. ///////////////////////////////////////////// //--- 98.05.27 S.Watanabe // dProp1 = OutputSource_DVD; //--- End. dProp2 = CompositeOut_On; dProp3 = SVideoOut_On; //--- 98.05.27 S.Watanabe // if( !pHwDevExt->dvdstrm.SetVideoProperty( VideoProperty_OutputSource, &dProp1 ) ){ // DBG_PRINTF( ("DVDWDM:Set Video output Error\n\r") ); // DBG_BREAK(); // return( FALSE ); // } //--- End. if( !pHwDevExt->dvdstrm.SetVideoProperty( VideoProperty_CompositeOut, &dProp2 ) ){ DBG_PRINTF( ("DVDWDM:Set Composite Video output Error\n\r") ); DBG_BREAK(); return( FALSE ); } pHwDevExt->m_CompositeOut = dProp2; if( !pHwDevExt->dvdstrm.SetVideoProperty( VideoProperty_SVideoOut, &dProp3 ) ){ DBG_PRINTF( ("DVDWDM:Set S-Video output Error\n\r") ); DBG_BREAK(); return( FALSE ); } pHwDevExt->m_SVideoOut = dProp3; return( TRUE ); }