Microsoft虚拟音频设备驱动程序样本(MSVAD)仅创建44字节文件

Dan*_*ert 2 c++ windows wdk

我目前正在研究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)