我目前正在研究MSVAD简单驱动程序。不幸的是,它无法按我希望的方式工作。新程序启动后,将在C:\下创建为STREAM_NN.WAV。
不幸的是,该文件只有44个字节(仅包含标头)。我附加了调试器视图,并得到以下输出:
MSVAD: [CMiniportWaveCyclic::NewStream]
MSVAD: [CMiniportWaveCyclicMSVAD::ValidateFormat]
MSVAD: [CMiniportWaveCyclic::NewStream]
MSVAD: [CMiniportWaveCyclicMSVAD::ValidateFormat]
MSVAD: CMiniportWaveCyclicMSVAD::ValidatePcm
MSVAD: [CSaveData::InitializeWorkItems]
MSVAD: [CMiniportWaveCyclicStreamMSVAD::Init]
MSVAD: SaveData 845A754C
MSVAD: [CSaveData::SetDataFormat]
MSVAD: [CSaveData::Initialize]
MSVAD: [CMiniportWaveCyclicStreamMSVAD::AllocateBuffer]
MSVAD: [CMiniportWaveCyclicStreamMSVAD::SetFormat]
MSVAD: [CSaveData::SetDataFormat]
MSVAD: New Format: 44100
MSVAD: [CMiniportWaveCyclicStreamMSVAD::SetNotificationFreq]
MSVAD: [CMiniportWaveCyclicStreamMSVAD::SetState]
MSVAD: [CMiniportWaveCyclicStreamMSVAD::SetState]
MSVAD: KSSTATE_PAUSE
MSVAD: [CMiniportWaveCyclicStreamMSVAD::SetState]
MSVAD: KSSTATE_RUN
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=480]
MSVAD: [CSaveData::WriteData ulByteCount=1284]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=628]
MSVAD: [CSaveData::WriteData ulByteCount=1136]
//Truncated for convenience
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=776]
MSVAD: [CSaveData::WriteData ulByteCount=988]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CSaveData::WriteData ulByteCount=1764]
MSVAD: [CMiniportWaveCyclicStreamMSVAD::SetState]
MSVAD: KSSTATE_PAUSE
MSVAD: [CMiniportWaveCyclicStreamMSVAD::SetState]
MSVAD: KSSTATE_STOP
MSVAD: [CSaveData::WaitAllWorkItems]
MSVAD: [CSaveData::SaveFrame]
MSVAD: [CMiniportWaveCyclicStreamMSVAD::SetState]
MSVAD: [CMiniportWaveCyclicStream::~CMiniportWaveCyclicStream]
MSVAD: [CMiniportWaveCyclicStreamMS::~CMiniportWaveCyclicStreamMS]
MSVAD: [CMiniportWaveCyclicStreamMSVAD::FreeBuffer]
MSVAD: [CSaveData::~CSaveData]
Run Code Online (Sandbox Code Playgroud)
在我看来,这很简单,例如,调用了所有必需的函数。我想知道此示例中是否存在已知错误,还是我必须考虑的任何警告?
该操作系统是Windows 7 32位虚拟机,正常的音频播放就像一个魅力。将简单驱动程序设置为默认播放设备。
小智 5
问题在于,由于DDK 8在方法CSaveData :: InitializeWorkItems(savedata.cpp)中已添加以下行:
if (m_pWorkItems)
{
return ntStatus;
}
Run Code Online (Sandbox Code Playgroud)
但是CSaveData ::〜CSaveData仅释放“工作项”,而不释放m_pWorkItems数组。这导致将来使用释放的“工作项”。
要解决此问题,您需要替换savedata.cpp中的代码,CSaveData :: InitializeWorkItems:
if (m_pWorkItems)
{
return ntStatus;
}
m_pWorkItems = (PSAVEWORKER_PARAM)
ExAllocatePoolWithTag
(
NonPagedPool,
sizeof(SAVEWORKER_PARAM) * MAX_WORKER_ITEM_COUNT,
MSVAD_POOLTAG
);
Run Code Online (Sandbox Code Playgroud)
通过此代码:
if (!m_pWorkItems)
{
m_pWorkItems = (PSAVEWORKER_PARAM)
ExAllocatePoolWithTag
(
NonPagedPool,
sizeof(SAVEWORKER_PARAM) * MAX_WORKER_ITEM_COUNT,
MSVAD_POOLTAG
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1372 次 |
| 最近记录: |