Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencontrol.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
1.7.6.1
|