Driver Management Finished?

git-svn-id: https://spexeah.com:8443/svn/Asuro@290 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
kieron 2018-04-04 20:35:33 +00:00
parent 0edad8444b
commit 648a6153e8

View File

@ -11,7 +11,7 @@ unit drivermanagement;
interface
uses
util, strings;
util, strings, lmemorymanager;
type
PDevEx = ^TDevEx;
@ -43,21 +43,103 @@ type
end;
procedure register_driver(DeviceID : PDeviceIdentifier; Load_Callback : TDriverLoadCallback);
procedure register_device(DeviceID : PDeviceIdentifier);
procedure register_device(DeviceID : PDeviceIdentifier; ptr : void);
var
Root : PDriverRegistration = nil;
implementation
procedure register_driver(DeviceID : PDeviceIdentifier; Load_Callback : TDriverLoadCallback);
begin
function identifiers_match(i1, i2 : PDeviceIdentifier) : boolean;
var
ll1, ll2 : PDevEx;
b1, b2 : boolean;
begin
identifiers_match:= true;
identifiers_match:= identifiers_match and (i1^.Bus = i2^.Bus);
identifiers_match:= identifiers_match and (i1^.id0 = i2^.id0);
identifiers_match:= identifiers_match and (i1^.id1 = i2^.id1);
identifiers_match:= identifiers_match and (i1^.id2 = i2^.id2);
identifiers_match:= identifiers_match and (i1^.id3 = i2^.id3);
ll1:= i1^.ex;
ll2:= i2^.ex;
while true do begin
b1:= ll1 <> nil;
b2:= ll2 <> nil;
identifiers_match:= identifiers_match and (b1 = b2);
if not (b1 and b2) then exit;
if b1 = b2 then begin
identifiers_match:= identifiers_match and (ll1^.idN = ll2^.idN);
end else begin
identifiers_match:= false;
exit;
end;
ll1:= ll1^.ex;
ll2:= ll2^.ex;
end;
end;
procedure register_device(DeviceID : PDeviceIdentifier);
begin
procedure register_driver(DeviceID : PDeviceIdentifier; Load_Callback : TDriverLoadCallback);
var
NewReg : PDriverRegistration;
root_ex,
param_ex, new_ex: PDevEx;
RegList : PDriverRegistration;
begin
if DeviceID = nil then exit;
NewReg:= PDriverRegistration(kalloc(sizeof(TDriverRegistration)));
NewReg^.Identifier.Bus:= DeviceID^.Bus;
NewReg^.Identifier.id0:= DeviceID^.id0;
NewReg^.Identifier.id1:= DeviceID^.id1;
NewReg^.Identifier.id2:= DeviceID^.id2;
NewReg^.Identifier.id3:= DeviceID^.id3;
root_ex:= nil;
if DeviceID^.ex <> nil then begin
root_ex:= PDevEx(kalloc(sizeof(TDevEx)));
param_ex:= DeviceID^.ex;
new_ex:= root_ex;
new_ex^.idN:= param_ex^.idN;
new_ex^.ex:= nil;
param_ex:= param_ex^.ex;
while param_ex <> nil do begin
new_ex^.ex:= PDevEx(kalloc(sizeof(TDevEx)));
new_ex:= new_ex^.ex;
new_ex^.idN:= param_ex^.idN;
param_ex:= param_ex^.ex;
end;
end;
NewReg^.Identifier.ex:= root_ex;
NewReg^.Loaded:= false;
NewReg^.Driver_Load:= Load_Callback;
NewReg^.Next:= nil;
if Root = nil then begin
Root:= NewReg;
end else begin
RegList:= Root;
While RegList^.Next <> nil do begin
RegList:= RegList^.Next;
end;
RegList^.Next:= NewReg;
end;
end;
procedure register_device(DeviceID : PDeviceIdentifier; ptr : void);
var
drv : PDriverRegistration;
begin
drv:= Root;
while drv <> nil do begin
if identifiers_match(@drv^.Identifier, DeviceID) then begin
if drv^.Driver_Load(ptr) then begin
drv^.Loaded:= true;
exit;
end;
end;
drv:= drv^.Next;
end;
end;
end.