ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

control.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS Kernel Streaming
00004  * FILE:            drivers/wdm/audio/sysaudio/control.c
00005  * PURPOSE:         System Audio graph builder
00006  * PROGRAMMER:      Johannes Anderwald
00007  */
00008 
00009 #include "sysaudio.h"
00010 
00011 const GUID KSPROPSETID_Sysaudio                 = {0xCBE3FAA0L, 0xCC75, 0x11D0, {0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6}};
00012 const GUID KSPROPSETID_Sysaudio_Pin             = {0xA3A53220L, 0xC6E4, 0x11D0, {0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6}};
00013 const GUID KSPROPSETID_General                  = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
00014 const GUID KSPROPSETID_Pin                     = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
00015 const GUID KSPROPSETID_Connection              = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
00016 const GUID KSPROPSETID_Topology                 = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
00017 const GUID KSDATAFORMAT_TYPE_AUDIO              = {0x73647561L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
00018 const GUID KSDATAFORMAT_SUBTYPE_PCM             = {0x00000001L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
00019 const GUID KSDATAFORMAT_SPECIFIER_WAVEFORMATEX  = {0x05589f81L, 0xc356, 0x11ce, {0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a}};
00020 
00021 NTSTATUS
00022 SetIrpIoStatus(
00023     IN PIRP Irp,
00024     IN NTSTATUS Status,
00025     IN ULONG Length)
00026 {
00027     Irp->IoStatus.Information = Length;
00028     Irp->IoStatus.Status = Status;
00029     if (Status != STATUS_PENDING)
00030     {
00031         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00032     }
00033     else
00034     {
00035         IoMarkIrpPending(Irp);
00036     }
00037     return Status;
00038 
00039 }
00040 
00041 PKSAUDIO_DEVICE_ENTRY
00042 GetListEntry(
00043     IN PLIST_ENTRY Head,
00044     IN ULONG Index)
00045 {
00046     PLIST_ENTRY Entry = Head->Flink;
00047 
00048     while(Index-- && Entry != Head)
00049         Entry = Entry->Flink;
00050 
00051     if (Entry == Head)
00052         return NULL;
00053 
00054     return (PKSAUDIO_DEVICE_ENTRY)CONTAINING_RECORD(Entry, KSAUDIO_DEVICE_ENTRY, Entry);
00055 }
00056 
00057 NTSTATUS
00058 SysAudioOpenVirtualDevice(
00059     IN PIRP Irp,
00060     IN ULONG DeviceNumber,
00061     PSYSAUDIODEVEXT DeviceExtension)
00062 {
00063     PKSAUDIO_DEVICE_ENTRY Entry;
00064     PIO_STACK_LOCATION IoStack;
00065 
00066     /* get current irp stack */
00067     IoStack = IoGetCurrentIrpStackLocation(Irp);
00068 
00069     /* sanity check */
00070     ASSERT(IoStack->FileObject);
00071 
00072     if (DeviceNumber >= DeviceExtension->NumberOfKsAudioDevices)
00073     {
00074         /* invalid device index */
00075         return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
00076     }
00077 
00078     /* get device context */
00079     Entry = GetListEntry(&DeviceExtension->KsAudioDeviceList, DeviceNumber);
00080     ASSERT(Entry != NULL);
00081 
00082     /* store device entry in FsContext
00083      * see pin.c DispatchCreateSysAudioPin for details
00084      */
00085     IoStack->FileObject->FsContext = (PVOID)Entry;
00086 
00087     return SetIrpIoStatus(Irp, STATUS_SUCCESS, 0);
00088 }
00089 
00090 NTSTATUS
00091 HandleSysAudioFilterPinProperties(
00092     PIRP Irp,
00093     PKSPROPERTY Property,
00094     PSYSAUDIODEVEXT DeviceExtension)
00095 {
00096     PIO_STACK_LOCATION IoStack;
00097     NTSTATUS Status;
00098     PKSAUDIO_DEVICE_ENTRY Entry;
00099     ULONG BytesReturned;
00100 
00101     // in order to access pin properties of a sysaudio device
00102     // the caller must provide a KSP_PIN struct, where
00103     // Reserved member points to virtual device index
00104 
00105     IoStack = IoGetCurrentIrpStackLocation(Irp);
00106     if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSP_PIN))
00107     {
00108         /* too small buffer */
00109         return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, sizeof(KSPROPERTY) + sizeof(ULONG));
00110     }
00111 
00112     Entry = GetListEntry(&DeviceExtension->KsAudioDeviceList, ((KSP_PIN*)Property)->Reserved);
00113     if (!Entry)
00114     {
00115         /* invalid device index */
00116         return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
00117     }
00118 
00119     /* forward request to the filter implementing the property */
00120     Status = KsSynchronousIoControlDevice(Entry->FileObject, KernelMode, IOCTL_KS_PROPERTY,
00121                                              (PVOID)IoStack->Parameters.DeviceIoControl.Type3InputBuffer,
00122                                              IoStack->Parameters.DeviceIoControl.InputBufferLength,
00123                                              Irp->UserBuffer,
00124                                              IoStack->Parameters.DeviceIoControl.OutputBufferLength,
00125                                              &BytesReturned);
00126 
00127     return SetIrpIoStatus(Irp, Status, BytesReturned);
00128 }
00129 
00130 
00131 NTSTATUS
00132 ComputeCompatibleFormat(
00133     IN PKSAUDIO_DEVICE_ENTRY Entry,
00134     IN ULONG PinId,
00135     IN PKSDATAFORMAT_WAVEFORMATEX ClientFormat,
00136     OUT PKSDATAFORMAT_WAVEFORMATEX MixerFormat)
00137 {
00138     BOOL bFound;
00139     ULONG BytesReturned;
00140     PKSP_PIN PinRequest;
00141     NTSTATUS Status;
00142     PKSMULTIPLE_ITEM MultipleItem;
00143     ULONG Length;
00144     PKSDATARANGE_AUDIO AudioRange;
00145     ULONG Index;
00146 
00147     Length = sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM) + ClientFormat->DataFormat.FormatSize;
00148     PinRequest = AllocateItem(NonPagedPool, Length);
00149     if (!PinRequest)
00150         return STATUS_UNSUCCESSFUL;
00151 
00152     PinRequest->PinId = PinId;
00153     PinRequest->Property.Set = KSPROPSETID_Pin;
00154     PinRequest->Property.Flags = KSPROPERTY_TYPE_GET;
00155     PinRequest->Property.Id = KSPROPERTY_PIN_DATAINTERSECTION;
00156 
00157     MultipleItem = (PKSMULTIPLE_ITEM)(PinRequest + 1);
00158     MultipleItem->Count = 1;
00159     MultipleItem->Size = ClientFormat->DataFormat.FormatSize;
00160 
00161     RtlMoveMemory(MultipleItem + 1, ClientFormat, ClientFormat->DataFormat.FormatSize);
00162     /* Query the miniport data intersection handler */
00163     Status = KsSynchronousIoControlDevice(Entry->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)PinRequest, Length, (PVOID)MixerFormat, sizeof(KSDATAFORMAT_WAVEFORMATEX), &BytesReturned);
00164 
00165     DPRINT("Status %x\n", Status);
00166 
00167     if (NT_SUCCESS(Status))
00168     {
00169         FreeItem(PinRequest);
00170         return Status;
00171     }
00172 
00173     /* Setup request block */
00174     PinRequest->Property.Id = KSPROPERTY_PIN_DATARANGES;
00175     /* Query pin data ranges */
00176     Status = KsSynchronousIoControlDevice(Entry->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)PinRequest, sizeof(KSP_PIN), NULL, 0, &BytesReturned);
00177 
00178     if (Status != STATUS_MORE_ENTRIES)
00179     {
00180         /* Failed to get data ranges */
00181         return Status;
00182     }
00183 
00184     MultipleItem = AllocateItem(NonPagedPool, BytesReturned);
00185     if (!MultipleItem)
00186     {
00187         FreeItem(PinRequest);
00188         return STATUS_NO_MEMORY;
00189     }
00190 
00191     Status = KsSynchronousIoControlDevice(Entry->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)PinRequest, sizeof(KSP_PIN), (PVOID)MultipleItem, BytesReturned, &BytesReturned);
00192     if (!NT_SUCCESS(Status))
00193     {
00194         DPRINT("Property Request KSPROPERTY_PIN_DATARANGES failed with %x\n", Status);
00195         FreeItem(MultipleItem);
00196         FreeItem(PinRequest);
00197         return STATUS_UNSUCCESSFUL;
00198     }
00199 
00200     AudioRange = (PKSDATARANGE_AUDIO)(MultipleItem + 1);
00201     bFound = FALSE;
00202     for(Index = 0; Index < MultipleItem->Count; Index++)
00203     {
00204         if (AudioRange->DataRange.FormatSize != sizeof(KSDATARANGE_AUDIO))
00205         {
00206             UNIMPLEMENTED
00207             AudioRange = (PKSDATARANGE_AUDIO)((PUCHAR)AudioRange + AudioRange->DataRange.FormatSize);
00208             continue;
00209         }
00210         /* Select best quality available */
00211 
00212         MixerFormat->DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX);
00213         MixerFormat->DataFormat.Flags = 0;
00214         MixerFormat->DataFormat.Reserved = 0;
00215         MixerFormat->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO;
00216         MixerFormat->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
00217         MixerFormat->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX;
00218         MixerFormat->DataFormat.SampleSize = 4;
00219         MixerFormat->WaveFormatEx.wFormatTag = ClientFormat->WaveFormatEx.wFormatTag;
00220 #ifndef NO_AC97_HACK
00221         /* HACK: AC97 does not support mono render / record */
00222         MixerFormat->WaveFormatEx.nChannels = 2;
00223         /*HACK: AC97 only supports 16-Bit Bits */
00224         MixerFormat->WaveFormatEx.wBitsPerSample = 16;
00225 
00226 #else
00227         MixerFormat->WaveFormatEx.nChannels = min(ClientFormat->WaveFormatEx.nChannels, AudioRange->MaximumChannels);
00228         MixerFormat->WaveFormatEx.wBitsPerSample = AudioRange->MaximumBitsPerSample;
00229 #endif
00230 
00231 #ifdef KMIXER_RESAMPLING_IMPLEMENTED
00232         MixerFormat->WaveFormatEx.nSamplesPerSec = AudioRange->MaximumSampleFrequency;
00233 #else
00234         MixerFormat->WaveFormatEx.nSamplesPerSec = max(AudioRange->MinimumSampleFrequency, min(ClientFormat->WaveFormatEx.nSamplesPerSec, AudioRange->MaximumSampleFrequency));
00235 #endif
00236 
00237         MixerFormat->WaveFormatEx.cbSize = 0;
00238         MixerFormat->WaveFormatEx.nBlockAlign = (MixerFormat->WaveFormatEx.nChannels * MixerFormat->WaveFormatEx.wBitsPerSample) / 8;
00239         MixerFormat->WaveFormatEx.nAvgBytesPerSec = MixerFormat->WaveFormatEx.nChannels * MixerFormat->WaveFormatEx.nSamplesPerSec * (MixerFormat->WaveFormatEx.wBitsPerSample / 8);
00240 
00241         bFound = TRUE;
00242         break;
00243 
00244         AudioRange = (PKSDATARANGE_AUDIO)((PUCHAR)AudioRange + AudioRange->DataRange.FormatSize);
00245     }
00246 
00247 #if 0
00248     DPRINT1("\nNum Max Channels %u Channels %u Old Channels %u\n Max SampleRate %u SampleRate %u Old SampleRate %u\n Max BitsPerSample %u BitsPerSample %u Old BitsPerSample %u\n",
00249            AudioRange->MaximumChannels, MixerFormat->WaveFormatEx.nChannels, ClientFormat->WaveFormatEx.nChannels,
00250            AudioRange->MaximumSampleFrequency, MixerFormat->WaveFormatEx.nSamplesPerSec, ClientFormat->WaveFormatEx.nSamplesPerSec,
00251            AudioRange->MaximumBitsPerSample, MixerFormat->WaveFormatEx.wBitsPerSample, ClientFormat->WaveFormatEx.wBitsPerSample);
00252 
00253 
00254 #endif
00255 
00256     FreeItem(MultipleItem);
00257     FreeItem(PinRequest);
00258 
00259     if (bFound)
00260         return STATUS_SUCCESS;
00261     else
00262         return STATUS_NOT_IMPLEMENTED;
00263 }
00264 
00265 NTSTATUS
00266 GetPinInstanceCount(
00267     PKSAUDIO_DEVICE_ENTRY Entry,
00268     PKSPIN_CINSTANCES PinInstances,
00269     PKSPIN_CONNECT PinConnect)
00270 {
00271     KSP_PIN PinRequest;
00272     ULONG BytesReturned;
00273 
00274     /* query the instance count */
00275     PinRequest.PinId = PinConnect->PinId;
00276     PinRequest.Property.Set = KSPROPSETID_Pin;
00277     PinRequest.Property.Flags = KSPROPERTY_TYPE_GET;
00278     PinRequest.Property.Id = KSPROPERTY_PIN_CINSTANCES;
00279     ASSERT(Entry->FileObject);
00280     return KsSynchronousIoControlDevice(Entry->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinRequest, sizeof(KSP_PIN), (PVOID)PinInstances, sizeof(KSPIN_CINSTANCES), &BytesReturned);
00281 
00282 }
00283 
00284 NTSTATUS
00285 SysAudioHandleProperty(
00286     PDEVICE_OBJECT DeviceObject,
00287     PIRP Irp)
00288 {
00289     PIO_STACK_LOCATION IoStack;
00290     NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
00291     KSPROPERTY PropertyRequest;
00292     KSCOMPONENTID ComponentId;
00293     PULONG Index;
00294     PKSPROPERTY Property;
00295     PSYSAUDIODEVEXT DeviceExtension;
00296     PKSAUDIO_DEVICE_ENTRY Entry;
00297     PSYSAUDIO_INSTANCE_INFO InstanceInfo;
00298     ULONG BytesReturned;
00299     UNICODE_STRING GuidString;
00300     PKSP_PIN Pin;
00301     LPWSTR DeviceName;
00302 
00303     IoStack = IoGetCurrentIrpStackLocation(Irp);
00304 
00305     if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSPROPERTY))
00306     {
00307         /* buffer must be at least of sizeof KSPROPERTY */
00308         return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, sizeof(KSPROPERTY));
00309     }
00310 
00311     Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
00312     DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
00313 
00314     if (IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_Pin))
00315     {
00316         return HandleSysAudioFilterPinProperties(Irp, Property, DeviceExtension);
00317     }
00318     else if(IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_Topology))
00319     {
00320         if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSP_PIN))
00321         {
00322             /* too small buffer */
00323             return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, sizeof(KSP_PIN));
00324         }
00325         Pin = (PKSP_PIN)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
00326         Entry = GetListEntry(&DeviceExtension->KsAudioDeviceList, Pin->Reserved);
00327         ASSERT(Entry != NULL);
00328 
00329         /* forward request to the filter implementing the property */
00330         Status = KsSynchronousIoControlDevice(Entry->FileObject, KernelMode, IOCTL_KS_PROPERTY,
00331                                              (PVOID)IoStack->Parameters.DeviceIoControl.Type3InputBuffer,
00332                                              IoStack->Parameters.DeviceIoControl.InputBufferLength,
00333                                              Irp->UserBuffer,
00334                                              IoStack->Parameters.DeviceIoControl.OutputBufferLength,
00335                                              &BytesReturned);
00336 
00337         return SetIrpIoStatus(Irp, Status, BytesReturned);
00338     }
00339     else if (IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_Sysaudio))
00340     {
00341         if (Property->Id == KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME)
00342         {
00343             if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSPROPERTY) + sizeof(ULONG))
00344             {
00345                 /* invalid request */
00346                 return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(KSPROPERTY) + sizeof(ULONG));
00347             }
00348             Index = (PULONG)(Property + 1);
00349 
00350             if (DeviceExtension->NumberOfKsAudioDevices <= *Index)
00351             {
00352                 /* invalid index */
00353                 return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
00354             }
00355 
00356             Entry = GetListEntry(&DeviceExtension->KsAudioDeviceList, *Index);
00357             ASSERT(Entry != NULL);
00358 
00359             BytesReturned = Entry->DeviceName.Length + sizeof(WCHAR);
00360             if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < BytesReturned)
00361             {
00362                 /* too small buffer */
00363                 return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, BytesReturned);
00364             }
00365 
00366             /* copy device name */
00367             DeviceName = (LPWSTR)Irp->UserBuffer;
00368 
00369             RtlMoveMemory(DeviceName, Entry->DeviceName.Buffer, Entry->DeviceName.Length);
00370             DeviceName[Entry->DeviceName.Length / sizeof(WCHAR)] = L'\0';
00371             return SetIrpIoStatus(Irp, STATUS_SUCCESS, BytesReturned);
00372         }
00373 
00374         if (Property->Id == KSPROPERTY_SYSAUDIO_COMPONENT_ID)
00375         {
00376             if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSPROPERTY) + sizeof(ULONG))
00377             {
00378                 /* too small buffer */
00379                 return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, sizeof(KSPROPERTY) + sizeof(ULONG));
00380             }
00381 
00382             if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSCOMPONENTID))
00383             {
00384                 /* too small buffer */
00385                 return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, sizeof(KSCOMPONENTID));
00386             }
00387 
00388             Index = (PULONG)(Property + 1);
00389 
00390             if (DeviceExtension->NumberOfKsAudioDevices <= *Index)
00391             {
00392                 /* invalid index */
00393                 return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0);
00394             }
00395             Entry = GetListEntry(&DeviceExtension->KsAudioDeviceList, *Index);
00396             ASSERT(Entry != NULL);
00397 
00398             PropertyRequest.Set = KSPROPSETID_General;
00399             PropertyRequest.Id = KSPROPERTY_GENERAL_COMPONENTID;
00400             PropertyRequest.Flags = KSPROPERTY_TYPE_GET;
00401 
00402             /* call the filter */
00403             Status = KsSynchronousIoControlDevice(Entry->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PropertyRequest, sizeof(KSPROPERTY), (PVOID)&ComponentId, sizeof(KSCOMPONENTID), &BytesReturned);
00404             if (!NT_SUCCESS(Status))
00405             {
00406                 DPRINT("KsSynchronousIoControlDevice failed with %x for KSPROPERTY_GENERAL_COMPONENTID\n", Status);
00407                 return SetIrpIoStatus(Irp, Status, 0);
00408             }
00409             RtlMoveMemory(Irp->UserBuffer, &ComponentId, sizeof(KSCOMPONENTID));
00410             return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(KSCOMPONENTID));
00411         }
00412         else if (Property->Id == KSPROPERTY_SYSAUDIO_DEVICE_COUNT)
00413         {
00414             if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG))
00415             {
00416                 /* too small buffer */
00417                 return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, sizeof(ULONG));
00418             }
00419 
00420             *((PULONG)Irp->UserBuffer) = DeviceExtension->NumberOfKsAudioDevices;
00421             return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(ULONG));
00422         }
00423         else if (Property->Id == KSPROPERTY_SYSAUDIO_DEVICE_INSTANCE)
00424         {
00425             if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG))
00426             {
00427                 /* too small buffer */
00428                 return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, sizeof(ULONG));
00429             }
00430 
00431             if (Property->Flags & KSPROPERTY_TYPE_SET)
00432             {
00433                 Index = (PULONG)Irp->UserBuffer;
00434                 return SysAudioOpenVirtualDevice(Irp, *Index, DeviceExtension);
00435             }
00436         }
00437         else if (Property->Id == KSPROPERTY_SYSAUDIO_INSTANCE_INFO)
00438         {
00439             if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SYSAUDIO_INSTANCE_INFO))
00440             {
00441                 /* too small buffer */
00442                 return SetIrpIoStatus(Irp, STATUS_BUFFER_TOO_SMALL, sizeof(SYSAUDIO_INSTANCE_INFO));
00443             }
00444 
00445             /* get input parameter */
00446             InstanceInfo = (PSYSAUDIO_INSTANCE_INFO)Property;
00447 
00448             if (Property->Flags & KSPROPERTY_TYPE_SET)
00449             {
00450                 return SysAudioOpenVirtualDevice(Irp, InstanceInfo->DeviceNumber, DeviceExtension);
00451             }
00452         }
00453     }
00454 
00455     RtlStringFromGUID(&Property->Set, &GuidString);
00456     DPRINT1("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
00457     RtlFreeUnicodeString(&GuidString);
00458     return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0);
00459 }

Generated on Sat May 26 2012 04:15:35 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.