==== KbdRegister ====
**Bindings**: [[reg#C bindings|C]], [[reg#MASM bindings|MASM]]
This call registers a keyboard subsystem within a session. 
KbdRegister (ModuleName, EntryPoint, FunctionMask) 
//ModuleName// (*PSZ*) - input 
Address of the dynamic link module name. Maximum length is 9 bytes (including ASCIIZ terminator). 
//EntryPoint// (**PSZ**) - input 
Address of the dynamic link entry point name of a routine that receives control when any of the registered functions are called. Maximum length is 33 bytes (including ASCIIZ terminator). 
//FunctionMask// (**ULONG**) - input 
A bit mask where each bit identifies a keyboard function being registered. The bit values are: 
^Bit ^Description ^
|31-15 |Reserved, must be \\ set to zero. |
|14 |KbdGetHWId |
|13 |KbdSetCustXt |
|12 |KbdXlate |
|11 |KbdSetCp |
|10 |KbdGetCp |
|9 |KbdFreeFocus |
|8 |KbdGetFocus |
|7 |KbdClose |
|6 |KbdOpen |
|5 |KbdStringIn |
|4 |KbdSetStatus |
|3 |KbdGetStatus |
|2 |KbdFlushBuffer |
|1 |KbdPeek |
|0 |KbdCharIn |
//rc// (**USHORT**) - return 
Return code descriptions are: 
|0 |NO_ERROR |
|408 |ERROR_KBD_INVALID_ASCIIZ |
|409 |ERROR_KBD_INVALID_MASK |
|410 |ERROR_KBD_REGISTER |
|464 |ERROR_KBD_DETACHED |
|504 |ERROR_KBD_EXTENDED_SG |
**Remarks**
There can be only one //KbdRegister// call outstanding for each session without an intervening KbdDeRegister. //[[en:ibm:prcp:kbd:dereg|KbdDeRegister]]// must be issued by the same process that issued the //KbdRegister//. 
=== C bindings ===
#define INCL_KBD
USHORT  rc = KbdRegister(ModuleName, EntryPoint, FunctionMask);
PSZ              ModuleName;    /* Module name */
PSZ              EntryPoint;    /* Entry point name */
ULONG            FunctionMask;  /* Function mask */
USHORT           rc;            /* return code */
=== MASM bindings ===
EXTRN  KbdRegister:FAR
INCL_KBD            EQU 1
PUSH@  ASCIIZ  ModuleName    ;Module name
PUSH@  ASCIIZ  EntryPoint    ;Entry point name
PUSH   DWORD   FunctionMask  ;Function mask
CALL   KbdRegister
Returns WORD