亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? devices.c

?? winNT技術操作系統,國外開放的原代碼和LIUX一樣
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 *
 * COPYRIGHT:            See COPYING in the top level directory
 * PROJECT:              ReactOS Multimedia
 * FILE:                 lib/wdmaud/devices.c
 * PURPOSE:              WDM Audio Support - Device Management
 * PROGRAMMER:           Andrew Greenwood
 * UPDATE HISTORY:
 *                       Nov 18, 2005: Created
 * 
 * WARNING! SOME OF THESE FUNCTIONS OUGHT TO COPY THE DEVICE INFO STRUCTURE
 * THAT HAS BEEN FED TO THEM!
*/

#include <windows.h>
#include "wdmaud.h"

const char WDMAUD_DEVICE_INFO_SIG[4] = "WADI";
const char WDMAUD_DEVICE_STATE_SIG[4] = "WADS";


/*
    IsValidDevicePath

    Just checks to see if the string containing the path to the device path
    (object) is a valid, readable string.
*/

BOOL IsValidDevicePath(WCHAR* path)
{
    if (IsBadReadPtr(path, 1))  /* TODO: Replace with flags */
    {
        DPRINT1("Bad interface\n");
        return FALSE;
    }

    /* Original driver seems to check for strlenW < 0x1000 */

    return TRUE;
}

/*
    ValidateDeviceData

    Checks that the memory pointed at by the device data pointer is writable,
    and that it has a valid signature.

    If the "state" member isn't NULL, the state structure is also validated
    in the same way. If the "require_state" parameter is TRUE and the "state"
    member is NULL, an error code is returned. Otherwise the "state" member
    isn't validated and no error occurs.
*/

MMRESULT ValidateDeviceData(
    PWDMAUD_DEVICE_INFO device,
    BOOL require_state
)
{
    if ( IsBadWritePtr(device, sizeof(WDMAUD_DEVICE_INFO)) )
    {
        DPRINT1("Device data structure not writable\n");
        return MMSYSERR_INVALPARAM;
    }

    if ( strncmp(device->signature, WDMAUD_DEVICE_INFO_SIG, 4) != 0 )
    {
        DPRINT1("Device signature is invalid\n");
        return MMSYSERR_INVALPARAM;
    }

    if ( ! IsValidDeviceType(device->type) )
    {
        DPRINT1("Invalid device type\n");
        return MMSYSERR_INVALPARAM;
    }

    if ( device->id > 100 )
    {
        DPRINT1("Device ID is out of range\n");
        return MMSYSERR_INVALPARAM;
    }

    /* Now we validate the device state (if present) */

    if ( device->state )
    {
        if ( IsBadWritePtr(device->state, sizeof(WDMAUD_DEVICE_INFO)) )
        {
            DPRINT1("Device state structure not writable\n");
            return MMSYSERR_INVALPARAM;
        }

        if ( strncmp(device->state->signature,
                     WDMAUD_DEVICE_STATE_SIG,
                     4) != 0 )
        {
            DPRINT1("Device state signature is invalid\n");
            return MMSYSERR_INVALPARAM;
        }

        /* TODO: Validate state events */
    }
    else if ( require_state )
    {
        return MMSYSERR_INVALPARAM;
    }

    return MMSYSERR_NOERROR;
}


/*
    ValidateDeviceStateEvents should be used in conjunction with the standard
    state validation routine (NOT on its own!)

    FIXME: The tests are wrong
*/
/*
MMRESULT ValidateDeviceStateEvents(PWDMAUD_DEVICE_STATE state)
{
    if ( ( (DWORD) state->exit_thread_event != 0x00000000 ) &&
         ( (DWORD) state->exit_thread_event != 0x48484848 ) )
    {
        DPRINT1("Bad exit thread event\n");
        return MMSYSERR_INVALPARAM;
    }

    if ( ( (DWORD) state->queue_event != 0x00000000 ) &&
         ( (DWORD) state->queue_event != 0x42424242 ) &&
         ( (DWORD) state->queue_event != 0x43434343 ) )
    {
        DPRINT1("Bad queue event\n");
        return MMSYSERR_INVALPARAM;
    }

    return MMSYSERR_NOERROR;
}
*/

/*
    CreateDeviceData

    This is a glorified memory allocation routine, which acts as a primitive
    constructor for a device data structure.

    It validates the device path given, allocates memory for both the device
    data and the device state data, copies the signatures over and sets the
    device type accordingly.

    In some cases, a state structure isn't required, so the creation of one can
    be avoided by passing FALSE for the "with_state" parameter.
*/

PWDMAUD_DEVICE_INFO
CreateDeviceData(
    CHAR device_type,
    DWORD device_id,
    WCHAR* device_path,
    BOOL with_state
)
{
    BOOL success = FALSE;
    PWDMAUD_DEVICE_INFO device = 0;
    int path_size = 0;

    DPRINT("Creating device data for device type %d\n", (int) device_type);

    if ( ! IsValidDevicePath(device_path) )
    {
        DPRINT1("No valid device interface given!\n");
        goto cleanup;
    }

    /* Take into account this is a unicode string... */
    path_size = (lstrlen(device_path) + 1) * sizeof(WCHAR);
    /* DPRINT("Size of path is %d\n", (int) path_size); */

    DPRINT("Allocating %d bytes for device data\n",
           path_size + sizeof(WDMAUD_DEVICE_INFO));

    device = (PWDMAUD_DEVICE_INFO)
        AllocMem(path_size + sizeof(WDMAUD_DEVICE_INFO));

    if ( ! device )
    {
        DPRINT1("Unable to allocate memory for device data (error %d)\n",
                (int) GetLastError());
        goto cleanup;
    }

    /* Copy the signature and device path */
    memcpy(device->signature, WDMAUD_DEVICE_INFO_SIG, 4);
    lstrcpy(device->path, device_path);

    /* Initialize these common members */
    device->id = device_id;
    device->type = device_type;

    if ( with_state )
    {
        /* Allocate device state structure */
        device->state = AllocMem(sizeof(WDMAUD_DEVICE_STATE));

        if ( ! device->state )
        {
            DPRINT1("Couldn't allocate memory for device state (error %d)\n",
                    (int) GetLastError());
            goto cleanup;
        }

        /* Copy the signature */
        memcpy(device->state->signature, WDMAUD_DEVICE_STATE_SIG, 4);
    }

    success = TRUE;

    cleanup :
    {
        if ( ! success )
        {
            if ( device )
            {
                if ( device->state )
                {
                    ZeroMemory(device->state->signature, 4);
                    FreeMem(device->state);
                }

                ZeroMemory(device->signature, 4);
                FreeMem(device);
            }
        }

        return (success ? device : NULL);
    }
}


/*
    DeleteDeviceData

    Blanks out the device and device state structures, and frees the memory
    associated with the structures.

    TODO: Free critical sections / events if set?
*/

void DeleteDeviceData(PWDMAUD_DEVICE_INFO device_data)
{
    DPRINT("Deleting device data\n");

    ASSERT( device_data );

    /* We don't really care if the structure is valid or not */
    if ( ! device_data )
        return;

    if ( device_data->state )
    {
        /* We DON'T want these to be set - should we clean up? */
        ASSERT ( ! device_data->state->device_queue_guard );
        ASSERT ( ! device_data->state->queue_event );
        ASSERT ( ! device_data->state->exit_thread_event );

        /* Insert a cow (not sure if this is right or not) */
        device_data->state->sample_size = 0xDEADBEEF;

        /* Overwrite the structure with zeroes and free it */
        ZeroMemory(device_data->state, sizeof(WDMAUD_DEVICE_STATE));
        FreeMem(device_data->state);
    }

    /* Overwrite the structure with zeroes and free it */
    ZeroMemory(device_data, sizeof(WDMAUD_DEVICE_INFO));
    FreeMem(device_data);
}

/*
    ModifyDevicePresence

    Use this to add or remove devices in the kernel-mode driver. If the
    "adding" parameter is TRUE, the device is added, otherwise it is removed.

    "device_type" is WDMAUD_WAVE_IN, WDMAUD_WAVE_OUT, etc...

    "device_path" specifies the NT object path of the device.

    (I'm not sure what happens to devices that are added but never removed.)
*/

MMRESULT ModifyDevicePresence(
    CHAR device_type,
    WCHAR* device_path,
    BOOL adding)
{
    DWORD ioctl = 0;
    PWDMAUD_DEVICE_INFO device_data = 0;
    MMRESULT result = MMSYSERR_ERROR;
    MMRESULT kernel_result = MMSYSERR_ERROR;

    DPRINT("ModifyDevicePresence - %s a device\n",
           adding ? "adding" : "removing");

    /* DPRINT("Topology path %S\n", device_path); */
    DPRINT("Devtype %d\n", (int) device_type);

    ASSERT( IsValidDeviceType(device_type) );
    ASSERT( device_path );

    device_data = CreateDeviceData(device_type, 0, device_path, FALSE);

    if ( ! device_data )
    {
        DPRINT1("Couldn't allocate memory for device data\n");
        result = MMSYSERR_NOMEM;
        goto cleanup;
    }

    ioctl = adding ? IOCTL_WDMAUD_ADD_DEVICE : IOCTL_WDMAUD_REMOVE_DEVICE;

    kernel_result = CallKernelDevice(device_data,
                                     ioctl,
                                     0,
                                     0);

    if ( kernel_result != MMSYSERR_NOERROR )
    {
        DPRINT1("WdmAudioIoControl FAILED with error %d\n", (int) kernel_result);

        switch ( kernel_result )
        {
            /* TODO: Translate into a real error code */
            default :
                result = MMSYSERR_ERROR;
        }

        goto cleanup;
    }

    DPRINT("ModifyDevicePresence succeeded\n");

    result = MMSYSERR_NOERROR;

    cleanup :
    {
        if ( device_data )
            DeleteDeviceData(device_data);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆免费视频| 欧美一级艳片视频免费观看| 欧美日韩在线三级| 精品国产免费久久| 一区二区三区久久久| 国产精品一区一区三区| 欧美一区二区播放| 亚洲免费观看在线观看| 成人小视频在线| 精品国一区二区三区| 午夜视频在线观看一区| 91同城在线观看| 日本一区二区视频在线| 狠狠色综合色综合网络| 91精品国产综合久久国产大片| 中文字幕一区二区三区色视频 | 91精品国产麻豆| 亚洲免费成人av| 国产精品亚洲一区二区三区妖精| 91视频观看免费| 国产精品三级电影| 国产成都精品91一区二区三| 亚洲精品一区二区三区蜜桃下载 | 亚洲图片另类小说| 国产成人高清视频| xfplay精品久久| 国内精品免费**视频| 日韩一区二区在线看| 日本特黄久久久高潮| 欧美电影一区二区| 石原莉奈在线亚洲三区| 精品视频1区2区3区| 亚洲成av人综合在线观看| 91福利国产精品| 日韩在线观看一区二区| 欧美肥大bbwbbw高潮| 亚洲福中文字幕伊人影院| 欧美日本一区二区| 奇米777欧美一区二区| 日韩美女视频在线| 国产一区二区精品久久99| 26uuu亚洲综合色欧美 | 成人午夜在线播放| 国产精品无码永久免费888| 懂色av中文一区二区三区| 国产精品免费视频观看| 99久久精品费精品国产一区二区| 亚洲日本va在线观看| 欧美视频中文字幕| 日本成人在线电影网| 精品成a人在线观看| 国产精品羞羞答答xxdd| 亚洲少妇30p| 欧美日韩激情在线| 寂寞少妇一区二区三区| 国产精品不卡在线| 欧美在线|欧美| 精东粉嫩av免费一区二区三区| 久久精品网站免费观看| 色哟哟日韩精品| 男人的天堂亚洲一区| 国产精品久久久久久久久久免费看| 91亚洲精品乱码久久久久久蜜桃| 亚洲一区在线观看视频| 日韩免费看网站| 91蝌蚪porny九色| 蜜桃av一区二区三区电影| 国产视频一区二区在线| 在线精品视频免费播放| 国产精品一线二线三线精华| 亚洲国产乱码最新视频| 久久综合九色综合欧美98| 色屁屁一区二区| 激情久久五月天| 亚洲制服欧美中文字幕中文字幕| 精品对白一区国产伦| 欧美性xxxxxx少妇| 丁香五精品蜜臀久久久久99网站| 五月天婷婷综合| 亚洲欧洲美洲综合色网| 日韩一级二级三级精品视频| 91色乱码一区二区三区| 精品一区二区国语对白| 亚洲一区二区三区四区在线观看| 久久久精品国产免费观看同学| 欧美在线免费观看亚洲| 国产91富婆露脸刺激对白| 日本va欧美va精品| 亚洲精品成人精品456| www国产精品av| 538prom精品视频线放| 91丨九色丨蝌蚪丨老版| 国产酒店精品激情| 麻豆成人在线观看| 亚洲第一会所有码转帖| 亚洲欧美激情插| 中文字幕一区视频| 国产视频不卡一区| 国产亚洲短视频| 精品国产一区a| 欧美va亚洲va香蕉在线| 91精品国产综合久久蜜臀| 欧美日韩性生活| 欧美私模裸体表演在线观看| 91麻豆精东视频| 91国偷自产一区二区三区观看| 99精品在线观看视频| 色哟哟欧美精品| 成人av影视在线观看| 国产精品夜夜嗨| 国产美女精品人人做人人爽| 蜜臀久久99精品久久久画质超高清| 日韩精品一级中文字幕精品视频免费观看 | 国产婷婷色一区二区三区| 久久久久青草大香线综合精品| 欧美一区二视频| 日韩美女主播在线视频一区二区三区| 777xxx欧美| 欧美成人一区二区三区在线观看| 日韩一区二区三| wwwwww.欧美系列| 国产欧美综合色| 国产精品成人一区二区艾草 | 色综合一区二区三区| 日本韩国欧美国产| 欧美色男人天堂| 欧美一区二区三区思思人 | 欧美性视频一区二区三区| 在线观看亚洲一区| 7878成人国产在线观看| 欧美成人精品二区三区99精品| 久久伊人中文字幕| 欧美激情一区三区| 亚洲精品自拍动漫在线| 亚洲成人av一区二区| 久久精品国产99国产精品| 国产经典欧美精品| 色老汉一区二区三区| 91精品久久久久久蜜臀| 国产亚洲成aⅴ人片在线观看| ...av二区三区久久精品| 亚洲成av人**亚洲成av**| 日韩和欧美的一区| 国产**成人网毛片九色| 在线观看欧美日本| 精品免费一区二区三区| 国产精品久久福利| 午夜视频久久久久久| 国产 欧美在线| 欧美日韩成人在线| 中文字幕一区二区三区不卡在线| 亚洲第一电影网| 成人高清免费观看| 这里只有精品99re| 中文字幕免费不卡在线| 天天色天天爱天天射综合| 国产精品一二一区| 91精品国模一区二区三区| 国产精品免费人成网站| 免费在线观看一区二区三区| k8久久久一区二区三区| 精品人在线二区三区| 亚洲国产精品尤物yw在线观看| 国产麻豆91精品| 欧美男男青年gay1069videost| 中文字幕一区二区日韩精品绯色| 日本美女视频一区二区| 北条麻妃一区二区三区| 日韩一级成人av| 亚洲国产日韩精品| 成人午夜视频网站| 精品国产乱码久久久久久牛牛| 亚洲欧美日韩电影| 国产永久精品大片wwwapp| 欧美三级三级三级爽爽爽| 国产精品久久久久久久久免费丝袜 | 蜜桃av一区二区三区| 91国产免费观看| 国产精品电影院| 国产九九视频一区二区三区| 欧美精品精品一区| 亚洲另类在线制服丝袜| 国产不卡免费视频| 日韩精品一区二区三区视频在线观看| 一区二区三区在线视频免费| 成人一区在线观看| 久久无码av三级| 久久国产精品第一页| 91精品国产综合久久福利| 亚洲永久精品大片| 91老师片黄在线观看| 亚洲三级在线看| 91猫先生在线| 亚洲一区在线播放| 一本到高清视频免费精品| 国产精品免费视频网站| 成人av第一页| 国产精品国产三级国产| 不卡大黄网站免费看| 中文字幕免费一区|