27 DPRINT(
"CreateSoundBlaster() called - extension 0x%x\n", sb_device);
33 Irp->IoStatus.Information = 0;
47 DPRINT(
"CloseSoundBlaster() called\n");
50 Irp->IoStatus.Information = 0;
64 DPRINT(
"CleanupSoundBlaster() called\n");
67 Irp->IoStatus.Information = 0;
82 DPRINT(
"ControlSoundBlaster() called\n");
86 switch (
stack->Parameters.DeviceIoControl.IoControlCode)
92 Irp->IoStatus.Information = 0;
106 DPRINT(
"WriteSoundBlaster() called\n");
109 Irp->IoStatus.Information = 0;
120 DPRINT(
"Sound Blaster driver unload\n");
175 DPRINT(
"Allocating memory for path info\n");
205 #define FreeRegistryPathInfo(ptr) \ 209 #define TAG_REG_INFO 'RegI' 210 #define TAG_REG_NAME 'RegN' 221 HANDLE devices_key_handle;
238 status = ZwEnumerateKey(devices_key_handle,
254 DPRINT(
"Out of memory\n");
259 status = ZwEnumerateKey(devices_key_handle,
268 DPRINT(
"Unable to enumerate keys\n");
281 DPRINT(
"Out of memory\n");
296 DPRINT(
"Callback FAILED\n");
305 DPRINT(
"Found %d subkey entries\n", key_index);
316 #define EnumerateDeviceKeys(path, callback, driver_obj) \ 317 EnumerateSubkey(path, L"Devices", callback, driver_obj) 328 WCHAR number_buffer[5];
338 sizeof(number_buffer) +
352 number.Buffer = number_buffer;
353 number.MaximumLength =
sizeof(number_buffer);
375 UCHAR device_index = 0;
377 DPRINT(
"Initializing a Sound Blaster device\n");
381 L"\\Device\\WaveOut",
389 L"\\Device\\WaveOut" +
wcslen(
L"\\Device\\"),
400 DPRINT(
"Symlink: %wZ\n", &dos_device_name);
428 device_object =
NULL;
449 DPRINT(
"Port %x IRQ %d DMA %d\n", parameters->
port, parameters->
irq, parameters->
dma);
451 DPRINT(
"Resetting the sound card\n");
475 DPRINT(
"Sound Blaster driver 0.1 by Silver Blade\n");
485 DPRINT(
"Beginning device key enumeration\n");
NTSTATUS NTAPI EnumerateSubkey(PUNICODE_STRING RegistryPath, PWSTR Subkey, PREGISTRY_CALLBACK_ROUTINE Callback, PDRIVER_OBJECT DriverObject)
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
#define FILE_BYTE_ALIGNMENT
_In_ __drv_aliasesMem PSTRING Prefix
#define STATUS_INSUFFICIENT_RESOURCES
VOID NTAPI UnloadSoundBlaster(PDRIVER_OBJECT DriverObject)
#define STATUS_NO_MORE_ENTRIES
#define OBJ_CASE_INSENSITIVE
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
static const WCHAR device_name[]
static stack_node_t * stack
NTSTATUS CreateDeviceName(PCWSTR PrePrefix, PCWSTR Prefix, UCHAR Index, PUNICODE_STRING DeviceName)
NTSTATUS NTAPI ControlSoundBlaster(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define STATUS_INTERNAL_ERROR
#define FreeRegistryPathInfo(ptr)
NTSTATUS NTAPI CloseSoundBlaster(PDEVICE_OBJECT DeviceObject, PIRP Irp)
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
static size_t double number
static struct _test_info info[]
struct _KEY_BASIC_INFORMATION * PKEY_BASIC_INFORMATION
#define IoCompleteRequest
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
REGISTRY_CALLBACK_ROUTINE * PREGISTRY_CALLBACK_ROUTINE
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
PWSTR NTAPI AllocateRegistryPathInfo(PUNICODE_STRING BasePath, PUNICODE_STRING ParametersPath, PKEY_BASIC_INFORMATION KeyInfo)
NTSTATUS NTAPI CleanupSoundBlaster(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
#define ExAllocatePool(type, size)
#define FILE_DEVICE_SOUND
#define DEFAULT_BUFFER_SIZE
#define EnumerateDeviceKeys(path, callback, driver_obj)
NTSTATUS NTAPI CreateSoundBlaster(PDEVICE_OBJECT DeviceObject, PIRP Irp)
ULONG AlignmentRequirement
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
NTSTATUS NTAPI WriteSoundBlaster(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define FIELD_OFFSET(t, f)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static void test_info(void)
NTSTATUS NTAPI OpenSubkey(PUNICODE_STRING RegistryPath, PWSTR Subkey, ACCESS_MASK DesiredAccess, OUT HANDLE *DevicesKeyHandle)
NTSTATUS NTAPI InitializeSoundBlaster(PDRIVER_OBJECT DriverObject, PWSTR RegistryPath)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_DEVICE_CONFIGURATION_ERROR
#define ExFreePoolWithTag(_P, _T)
static SERVICE_STATUS status
#define IRP_MJ_DEVICE_CONTROL
#define KEY_ENUMERATE_SUB_KEYS