📄 tmman32.c
字号:
DownLoaderStatus = TMDwnLdr_multiproc_relocate(ObjectHandle,
HostType,
(Address*)MMIOPhysicalAddressArray,
DSPInfo.DSPNumber,
iDSPCount,
ClockSpeed,
(Address)AlignedDownloadAddress,
DSPInfo.SDRAM.Size,
CacheOption);
if (DownLoaderStatus != TMDwnLdr_OK)
{
Status = tmmanDownloaderStatusToTMManStatus(DownLoaderStatus);
goto tmmanDSPLoadExit3;
}
}
#else
if ( ( DownLoaderStatus = TMDwnLdr_relocate (
ObjectHandle,
HostType,
(Address)DSPInfo.MMIO.PhysicalAddress, // mmio base
ClockSpeed,
(Address)AlignedDownloadAddress, //physical adderss of download
DSPInfo.SDRAM.Size,
CacheOption ) ) != TMDwnLdr_OK )
{
Status = tmmanDownloaderStatusToTMManStatus(DownLoaderStatus);
goto tmmanDSPLoadExit3;
}
#endif
if ( ( DownLoaderStatus = TMDwnLdr_get_endian ( ObjectHandle,
&endian )) != TMDwnLdr_OK )
{
Status = tmmanDownloaderStatusToTMManStatus(DownLoaderStatus);
goto tmmanDSPLoadExit3;
}
// 1 = little endian & 0 = big endian
// LittleEndian = 1 & BigEndian = 0
if ( INIEndianess != endian )
{
Status = statusExecutableFileWrongEndianness;
goto tmmanDSPLoadExit3;
}
// we know what is the target executables endianess
// call the kernel mode driver to reconfigure itself in the correct
// endianess
TMIF.DSPHandle = DSPHandle;
TMIF.Endianess =
( endian == LittleEndian ) ? constTMManEndianessLittle : constTMManEndianessBig;
if ( ( TMDwnLdr_get_contents (
ObjectHandle,
"__TMMan_Version",
&TargetVersion ) ) != TMDwnLdr_OK )
{
/*
//OutputDebugString ( TMDwnLdr_get_last_error (DownLoaderStatus) );
if ( ! Global.DisableDialogBox )
{
WarningBox(TEXT("Target Executable has not been linked with [-host WinNT] or [-host Windows]\n"));
}
*/
TMIF.PeerMajorVersion = constTMManDefaultVersionMajor;
TMIF.PeerMinorVersion = constTMManDefaultVersionMinor;
}
else
{
// major version = __TMMan_Version[31:16]
// minor version = __TMMan_Version[15:0]
TMIF.PeerMajorVersion = ( ( TargetVersion & 0xffff0000 ) >> 16 ) ;
TMIF.PeerMinorVersion = TargetVersion & ( 0x0000ffff );
if ( ! Global.DisableDialogBox )
{
if ( ( TMIF.PeerMajorVersion != verGetFileMajorVersion() ) ||
( TMIF.PeerMinorVersion != verGetFileMinorVersion() ) )
{
wsprintf ( szTemp, TEXT("Target Executable Version [%d.%d] is INCOMPATIBLE with TriMedia Driver Version [%d.%d]\n"),
TMIF.PeerMajorVersion, TMIF.PeerMinorVersion, verGetFileMajorVersion(), verGetFileMinorVersion() );
//WarningBox ( szTemp );
switch ( ( MessageBox ( NULL,
szTemp,
TEXT("TriMedia Manager : tmman32.dll : Continue ? "),
MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1 | MB_APPLMODAL ) ) )
{
case IDOK :
break;
case IDCANCEL :
default :
Status = ( TMIF.PeerMajorVersion != verGetFileMajorVersion() ) ? statusMajorVersionError : statusMinorVersionError;
goto tmmanDSPLoadExit3;
}
}
}
}
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanDSPLoad,
(PVOID)&TMIF, sizeof( tmifDSPLoad),
(PVOID)&TMIF, sizeof( tmifDSPLoad),
&BytesReturned, NULL ) != TRUE )
{
Status = TMIF.Status;
goto tmmanDSPLoadExit3;
}
// BUGCHECK - adjust this based on download address
if ( ( DownLoaderStatus = TMDwnLdr_get_memory_image (
ObjectHandle,
(UInt8*)tmmanPhysicalToMapped (&DSPInfo.SDRAM, AlignedDownloadAddress)) ) != TMDwnLdr_OK )
{
Status = tmmanDownloaderStatusToTMManStatus(DownLoaderStatus);
goto tmmanDSPLoadExit3;
}
tmmanDSPLoadExit3 :
TMDwnLdr_unload_object ( ObjectHandle );
tmmanDSPLoadExit2 :
tmmanDSPUnmapSDRAM ( DSPHandle );
tmmanDSPLoadExit1 :
return Status;
}
TMStatus tmmanDSPStart (
UInt32 DSPHandle )
{
tmifGenericFunction TMIF;
TMStatus Status = statusSuccess;
UInt32 BytesReturned;
TMIF.Handle = DSPHandle;
//TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanDSPStart,
(PVOID)&TMIF, sizeof (tmifGenericFunction),
(PVOID)&TMIF, sizeof (tmifGenericFunction),
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
else
{
Status = TMIF.Status;
}
return Status;
}
TMStatus tmmanDSPStop (
UInt32 DSPHandle )
{
tmifGenericFunction TMIF;
UInt32 BytesReturned;
TMIF.Handle = DSPHandle;
//TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanDSPStop,
(PVOID)&TMIF, sizeof (tmifGenericFunction),
(PVOID)&TMIF, sizeof (tmifGenericFunction),
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
return TMIF.Status;
}
TMStatus tmmanDSPReset (
UInt32 DSPHandle )
{
tmifGenericFunction TMIF;
UInt32 BytesReturned;
TMIF.Handle = DSPHandle;
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanDSPReset,
(PVOID)&TMIF, sizeof (tmifGenericFunction),
(PVOID)&TMIF, sizeof (tmifGenericFunction),
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
return TMIF.Status;
}
// DEBUGGING INTERFACES
TMStatus tmmanDebugOptions (
UInt32 DSPHandle,
UInt32 Option )
{
TMStatus Status;
tmmanDSPInternalInfo DSPInternalInfo;
Status = tmmanDSPGetInternalInfo ( DSPHandle, &DSPInternalInfo );
if ( Status != statusSuccess )
return Status;
DSPInternalInfo.DebugOptionBitmap = Option;
return tmmanDSPSetInternalInfo ( DSPHandle, &DSPInternalInfo );
}
TMStatus tmmanDebugDPBuffers (
UInt32 DSPHandle,
UInt8* *FirstHalfPtr,
UInt32* FirstHalfSizePtr,
UInt8* *SecondHalfPtr,
UInt32* SecondHalfSizePtr )
{
tmifDebugBuffers TMIF;
UInt32 BytesReturned;
tmmanDSPInfo DSPInfo;
TMStatus Status;
TMIF.DSPHandle = DSPHandle;
//TMIF.ClientHandle = Global.dwClientHandle;
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanGetDebugDPBuffers,
(PVOID)&TMIF, sizeof (tmifDebugBuffers),
(PVOID)&TMIF, sizeof (tmifDebugBuffers),
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
if ( ( Status = tmmanDSPGetInfo (
DSPHandle,
&DSPInfo ) ) != statusSuccess )
{
return Status;
}
/*
DSPInfo.DSPHandle = DSPHandle;
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanDSPInfo,
(PVOID)&DSPInfo, sizeof( tmifDSPInfo) ,
(PVOID)&DSPInfo, sizeof( tmifDSPInfo) ,
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
*/
// remove this by changing the HalfPtrs to Offsets.
if ( TMIF.FirstHalfPtr )
{
*FirstHalfPtr =
(UInt8*)((DWORD)DSPInfo.SDRAM.MappedAddress +
(DWORD)TMIF.FirstHalfPtr );
}
if ( TMIF.SecondHalfPtr )
{
*SecondHalfPtr =
(UInt8*)((DWORD)DSPInfo.SDRAM.MappedAddress +
(DWORD)TMIF.SecondHalfPtr );
}
*FirstHalfSizePtr = TMIF.FirstHalfSize;
*SecondHalfSizePtr = TMIF.SecondHalfSize;
return TMIF.Status;
}
TMStatus tmmanDebugHostBuffers (
UInt8* *FirstHalfPtr,
UInt32* FirstHalfSizePtr,
UInt8* *SecondHalfPtr,
UInt32* SecondHalfSizePtr )
{
tmifDebugBuffers TMIF;
UInt32 BytesReturned;
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanGetDebugHostBuffers,
(PVOID)&TMIF, sizeof (tmifDebugBuffers),
(PVOID)&TMIF, sizeof (tmifDebugBuffers),
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
*FirstHalfPtr = TMIF.FirstHalfPtr;
*SecondHalfPtr = TMIF.SecondHalfPtr;
*FirstHalfSizePtr = TMIF.FirstHalfSize;
*SecondHalfSizePtr = TMIF.SecondHalfSize;
return TMIF.Status;
}
TMStatus tmmanDebugTargetBuffers (
UInt32 DSPHandle,
UInt8* *FirstHalfPtr,
UInt32* FirstHalfSizePtr,
UInt8* *SecondHalfPtr,
UInt32* SecondHalfSizePtr )
{
tmifDebugBuffers TMIF;
UInt32 BytesReturned;
tmmanDSPInfo DSPInfo;
TMStatus Status;
TMIF.DSPHandle = DSPHandle;
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanGetDebugTargetBuffers,
(PVOID)&TMIF, sizeof (tmifDebugBuffers),
(PVOID)&TMIF, sizeof (tmifDebugBuffers),
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
if ( ( Status = tmmanDSPGetInfo (
DSPHandle,
&DSPInfo ) ) != statusSuccess )
{
return Status;
}
/*
DSPInfo.DSPHandle = DSPHandle;
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanDSPInfo,
(PVOID)&DSPInfo, sizeof( tmifDSPInfo) ,
(PVOID)&DSPInfo, sizeof( tmifDSPInfo) ,
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
*/
// remove this by changing the HalfPtrs to Offsets.
if ( TMIF.FirstHalfPtr )
{
*FirstHalfPtr =
(UInt8*)((DWORD)DSPInfo.SDRAM.MappedAddress +
(DWORD)TMIF.FirstHalfPtr );
}
if ( TMIF.SecondHalfPtr )
{
*SecondHalfPtr =
(UInt8*)((DWORD)DSPInfo.SDRAM.MappedAddress +
(DWORD)TMIF.SecondHalfPtr );
}
*FirstHalfSizePtr = TMIF.FirstHalfSize;
*SecondHalfSizePtr = TMIF.SecondHalfSize;
return TMIF.Status;
}
UInt32 tmmanDebugPrintf ( Int8 *Format, ... )
{
UInt8 DebugBuffer[constTMManDebugStringLength];
UInt32 Sentinel = 0xdeadbeef;
UInt32 StringLength;
UInt32 BytesReturned;
va_list va;
va_start(va, Format);
vsprintf( DebugBuffer, Format, va);
va_end(va);
if ( Sentinel != 0xdeadbeef )
{
return statusStringBufferOverflow;
}
StringLength = strlen ( DebugBuffer );
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanDebugPrintf,
(PVOID)DebugBuffer, StringLength + 1,
Null, 0,
&BytesReturned, NULL ) != TRUE )
{
return statusDeviceIoCtlFail;
}
return statusSuccess;
}
UInt32 tmmanMappedToPhysical (
tmmanMemoryBlock* MemoryBlock,
UInt32 MappedAddress )
{
return MemoryBlock->PhysicalAddress + (MappedAddress - MemoryBlock->MappedAddress);
}
UInt32 tmmanPhysicalToMapped (
tmmanMemoryBlock* MemoryBlock,
UInt32 PhysicalAddress )
{
return MemoryBlock->MappedAddress + (PhysicalAddress - MemoryBlock->PhysicalAddress);
}
Bool tmmanValidateAddressAndLength (
tmmanMemoryBlock* MemoryBlock,
UInt32 Address,
UInt32 Length )
{
// assumes that MMIO and SDRAM are not contigious.
if ( ( Address >= MemoryBlock->PhysicalAddress ) &&
( Address < (MemoryBlock->PhysicalAddress + MemoryBlock->Size - 1) ) )
{
if ( ( Address + Length ) <=
(MemoryBlock->PhysicalAddress + MemoryBlock->Size - 1))
return True;
else
return False;
}
return False;
}
Bool tmmanTranslateAdapterAddress (
UInt32 MappedAddress,
UInt32 Length,
UInt32 *PhysicalAddressPtr )
{
tmifGenericFunction TMIF;
UInt32 BytesReturned;
HANDLE MutexHandle;
if ( ( MutexHandle = CreateMutex(
NULL,
FALSE, // flag for initial ownership
TEXT("tmman32XlateMutex") ) ) == NULL )
{
return statusDeviceIoCtlFail;
}
WaitForSingleObject( MutexHandle, INFINITE );
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanXlateAdapterAddress1,
(PVOID)&TMIF, sizeof (tmifGenericFunction),
(PVOID)MappedAddress, Length,
&BytesReturned, NULL ) != TRUE )
{
CloseHandle ( MutexHandle );
return statusDeviceIoCtlFail;
}
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanXlateAdapterAddress2,
(PVOID)&TMIF, sizeof (tmifGenericFunction),
(PVOID)&TMIF, sizeof (tmifGenericFunction),
&BytesReturned, NULL ) != TRUE )
{
CloseHandle ( MutexHandle );
return statusDeviceIoCtlFail;
}
ReleaseMutex ( MutexHandle );
CloseHandle ( MutexHandle );
*PhysicalAddressPtr = TMIF.Handle;
return statusSuccess;
}
Int8* tmmanGetErrorString (
TMStatus StatusCode )
{
return errorGetErrorString( StatusCode );
}
// HELPER FUNCTIONS - NOT EXPORTED BY THE INTERFACE
void ErrorBox ( TCHAR* ErrorString )
{
MessageBox ( NULL,
ErrorString,
TEXT("TriMedia Manager : tmman32.dll : FATAL ERROR"),
MB_OK | MB_ICONSTOP | MB_DEFBUTTON1 | MB_APPLMODAL );
}
void WarningBox ( TCHAR* ErrorString )
{
MessageBox ( NULL,
ErrorString,
TEXT("TriMedia Manager : tmman32.dll : WARNING"),
MB_OK | MB_ICONWARNING | MB_DEFBUTTON1 | MB_APPLMODAL );
}
TMStatus tmmanMessageCreate (
UInt32 DSPHandle,
Int8* Name,
UInt32 SynchronizationHandle,
UInt32 SynchronizationFlags,
UInt32* MessageHandlePointer )
{
tmifMessageCreate TMIF;
UInt32 BytesReturned;
TMIF.DSPHandle = DSPHandle;
if ( strlen ( Name ) >= constTMManNameSpaceNameLength )
{
return statusNameSpaceLengthExceeded;
}
strcpy ( TMIF.Name, Name );
switch ( WindowsVersion )
{
case WINDOWS_OS_WIN98 :
case WINDOWS_OS_WINNT40 :
case WINDOWS_OS_WINNT50 :
TMIF.SynchObject = SynchronizationHandle;
break;
case WINDOWS_OS_WIN95 :
{
HMODULE InstanceHandle;
FARPROC ProcAddress;
if ( ( InstanceHandle = LoadLibrary (TEXT("Kernel32.dll")) ) == NULL )
{
OutputDebugString( TEXT("tmman32:LoadLibrary:FAIL\n") );
//return statusCannotLoadKernel32DLL;
return statusDeviceIoCtlFail;
}
if ( ( ProcAddress = GetProcAddress(InstanceHandle, TEXT("OpenVxDHandle")) ) == NULL )
{
OutputDebugString( TEXT("tmman32:LoadLibrary:FAIL\n") );
FreeLibrary (InstanceHandle);
//return statusCannotLoadKernel32DLL;
return statusDeviceIoCtlFail;
}
TMIF.SynchObject = (ProcAddress)(SynchronizationHandle);
FreeLibrary (InstanceHandle);
}
break;
}
TMIF.SynchFlags = SynchronizationFlags;
//TMIF.ClientHandle = Global.dwClientHandle;
EnterCriticalSection ( &Global.MessageCriticalSection );
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanMessageCreate,
(PVOID)&TMIF, sizeof (tmifMessageCreate),
(PVOID)&TMIF, sizeof (tmifMessageCreate),
&BytesReturned, NULL ) != TRUE )
{
LeaveCriticalSection ( &Global.MessageCriticalSection );
return statusDeviceIoCtlFail;
}
*MessageHandlePointer = TMIF.MessageHandle;
LeaveCriticalSection ( &Global.MessageCriticalSection );
return TMIF.Status;
}
TMStatus tmmanMessageDestroy (
UInt32 MessageHandle )
{
tmifGenericFunction TMIF;
UInt32 BytesReturned;
TMIF.Handle = MessageHandle;
//TMIF.ClientHandle = Global.dwClientHandle;
EnterCriticalSection ( &Global.MessageCriticalSection );
if ( DeviceIoControl ( Global.hDevice,
constIOCTLtmmanMessageDestroy,
(PVOID)&TMIF, sizeof (tmifGenericFunction),
(PVOID)&TMIF, sizeof (tmifGenericFunction),
&BytesReturned, NULL ) != TRUE )
{
LeaveCriticalSection ( &Global.MessageCriticalSection );
return statusDeviceIoCtlFail;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -