I haven't used DPMI services but I presume you are in PMode. I would do it like this then:

[pascal]
type
TIdtE = array[0..3] of word;
PIdtE = ^TIdtE;

var olde: TIdtE;

procedure KeyIrq; interrupt;
begin

end;

procedure InitKeyInterrupt;
var idtr: packed record limit: word; offset: cardinal; end;
r: PIdtE;
p: word;
begin
asm
cli
sidt [idtr]
end;
r := Pointer(idtr.offset);
olde := r[9];
r[9,0] := cardinal(@KeyIrq) and $FFFF;
asm
xor edi,edi
push cs
pop di
mov p,di
end['edi'];
r[9,1] := p;
r[9,2] := $E400;
r[9,3] := (cardinal(@KeyIrq) shr 16) and $FFFF;
asm
sti
lidt [idtr]
end;
end;

procedure SetOldKeyboard;
var idtr: packed record limit: word; offset: cardinal; end;
r: PIdtE;
p: word;
begin
asm
cli
sidt [idtr]
end;
r := Pointer(idtr.offset);
r[9] := olde;
asm
sti
lidt [idtr]
end;
end;[/pascal]