mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
238 lines
4.2 KiB
238 lines
4.2 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
detother.c
|
|
|
|
Abstract:
|
|
|
|
This is the main file for the autodetection DLL for all the non-network cards.
|
|
|
|
Author:
|
|
|
|
Sean Selitrennikoff (SeanSe) October 1992.
|
|
|
|
Environment:
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
#include <windows.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "ntddnetd.h"
|
|
#include "detect.h"
|
|
|
|
|
|
VOID
|
|
SoundBlaster(
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine finds the instances of a physical sound blaster card.
|
|
|
|
Arguments:
|
|
|
|
InterfaceType - Either Isa, or Eisa.
|
|
|
|
BusNumber - The bus number of the bus to search.
|
|
|
|
Return Value:
|
|
|
|
none.
|
|
|
|
--*/
|
|
|
|
{
|
|
ULONG PortNumber;
|
|
NTSTATUS NtStatus;
|
|
UCHAR Value;
|
|
UCHAR i;
|
|
NETDTECT_RESOURCE ClaimedResource;
|
|
|
|
//
|
|
// Check interface type
|
|
//
|
|
|
|
if ((InterfaceType != Isa) &&
|
|
(InterfaceType != Eisa)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
//
|
|
// Check that the ports are free
|
|
//
|
|
|
|
if (DetectCheckPortUsage(InterfaceType,
|
|
BusNumber,
|
|
0x380,
|
|
0x10
|
|
) != STATUS_SUCCESS) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
//
|
|
// For each possible port address
|
|
//
|
|
|
|
for (PortNumber = 0x210; PortNumber < 0x270; PortNumber += 0x10) {
|
|
|
|
//
|
|
// Check that the ports are free
|
|
//
|
|
|
|
if (DetectCheckPortUsage(InterfaceType,
|
|
BusNumber,
|
|
PortNumber,
|
|
0x10
|
|
) != STATUS_SUCCESS) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
//
|
|
// Check for the card
|
|
//
|
|
|
|
NtStatus = DetectWritePortUchar(
|
|
InterfaceType,
|
|
BusNumber,
|
|
PortNumber + 0x6,
|
|
0x01
|
|
);
|
|
|
|
if (NtStatus != STATUS_SUCCESS) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
Sleep(3);
|
|
|
|
NtStatus = DetectWritePortUchar(
|
|
InterfaceType,
|
|
BusNumber,
|
|
PortNumber + 0x6,
|
|
0x00
|
|
);
|
|
|
|
if (NtStatus != STATUS_SUCCESS) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
for (i = 0; i < 10; i++) {
|
|
|
|
Sleep(1);
|
|
|
|
NtStatus = DetectReadPortUchar(
|
|
InterfaceType,
|
|
BusNumber,
|
|
PortNumber + 0xE,
|
|
&Value
|
|
);
|
|
|
|
if (NtStatus != STATUS_SUCCESS) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (Value & 0x80) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if (Value & 0x80) {
|
|
|
|
//
|
|
// Check for majic number
|
|
//
|
|
|
|
NtStatus = DetectReadPortUchar(
|
|
InterfaceType,
|
|
BusNumber,
|
|
PortNumber + 0xA,
|
|
&Value
|
|
);
|
|
|
|
if (NtStatus != STATUS_SUCCESS) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// If found then we claim the resources for this card
|
|
//
|
|
|
|
if (Value == 0xAA) {
|
|
|
|
//
|
|
// Claim joystick range
|
|
//
|
|
|
|
ClaimedResource.InterfaceType = InterfaceType;
|
|
ClaimedResource.BusNumber = BusNumber;
|
|
ClaimedResource.Type = NETDTECT_PORT_RESOURCE;
|
|
ClaimedResource.Flags = 0;
|
|
|
|
ClaimedResource.Value = 0x200;
|
|
ClaimedResource.Length = 0x10;
|
|
|
|
DetectTemporaryClaimResource(&ClaimedResource);
|
|
|
|
//
|
|
// Claim base range
|
|
//
|
|
|
|
ClaimedResource.Value = PortNumber;
|
|
ClaimedResource.Length = 0x10;
|
|
|
|
DetectTemporaryClaimResource(&ClaimedResource);
|
|
|
|
//
|
|
// Claim Ad lib range
|
|
//
|
|
|
|
ClaimedResource.Value = 0x380;
|
|
ClaimedResource.Length = 0x10;
|
|
|
|
DetectTemporaryClaimResource(&ClaimedResource);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|