Drivers are informed about their device node through a system control call issued by Configuration Manger.
/* * DRIVER.C - NewDriver Support for SAMPLE * This file processes the Driver requests. */ #include <basedef.h> #include <vmm.h> #include <debug.h> #include <configmg.h> #include <pnpdrvs.h> #include <misc.h> #include <driver.h> #pragma VxD_LOCKED_CODE_SEG IO_RESOURCE Res1= { {2, IOType_Range, 0, 0, 0, 0, 0}, { {0xFFFF, 1, 0x103, 0x103, 0, 0xFF, 0xFF}, {0xFFFF, 1, 0x203, 0x203, 0, 0xFF, 0xFF}, } }; IO_RESOURCE Res2= { {2, IOType_Range, 0, 0, 0, 0, 0}, { {0x0300, 6, 0x200, 0x307, 0, 3, 3}, {0x03F0, 4, 0x300, 0x313, 0, 3, 3}, } }; /***************************************************************** * * ConfigHandler - Handler of the Configuration Manager * configuration call * * Exported. * * ENTRY: Standard config handler. * EXIT: Standard Configuration Manager return value. * ****************************************************************/ CONFIGRET CM_HANDLER ConfigHandler(CONFIGFUNC cfFuncName, SUBCONFIGFUNC scfSubFuncName, DEVNODE dnToDevNode, DEVNODE dnAboutDevNode, ULONG ulFlags) { LOG_CONF lc; RES_DES rd; CONFIGRET status; switch (cfFuncName) { case CONFIG_FILTER: // Get the first filtered logical configuration. status=CM_Get_First_Log_Conf(&lc, dnAboutDevNode, FILTERED_LOG_CONF); // For all logical configuration (we stopped when // the status is not CR_SUCCESS since it can only // become CR_NO_MORE_LOG_CONF). while (status==CR_SUCCESS) { // For all resource descriptors rd=(RES_DES)lc; while (CM_Get_Next_Res_Des(&rd, rd, ResType_Mem, NULL, 0)==CR_SUCCESS) { // For all memory resource // (for instance) do some // checking (like ISA impose // <16Meg) } // Next logical configuration. status=CM_Get_Next_Log_Conf(&lc, lc, 0); } return(CR_SUCCESS); case CONFIG_START: // You may or may not treat CONFIG_START_FIRST_START // different from CONFIG_START_DYNAMIC_START. // As far as CM goes, the first time it would // have called with CONFIG_START_DYNAMIC_START; // it will call with CONFIG_START_FIRST_START // instead. return(CR_SUCCESS); case CONFIG_TEST: return(CR_SUCCESS); case CONFIG_STOP: return(CR_SUCCESS); case CONFIG_REMOVE: // deallocate per instance data. return(LeaveInstance(CR_SUCCESS)); default: return(CR_DEFAULT); } } /***************************************************************** * * NewDriver - Register a new driver for the new device node * * Exported. * * ENTRY: DevNode is the new device node that has just been created. * * EXIT: Standard Configuration Manager return value. * ****************************************************************/ CONFIGRET CM_INTERNAL NewDriver(DEVNODE DevNode) { LOG_CONF lc; RES_DES rd1, rd2; // Any failure should use LeaveInstance to unload the DLVxD if // it is the only instance. Only if it is success will we not // return with an "OR"ed CR_UNLOAD. // BUGBUG error checking CM_Add_Empty_Log_Conf(&lc, DevNode, 0, BASIC_LOG_CONF); CM_Add_Res_Des(&rd1, lc, ResType_IO, &Res1, SIZEOF_IORANGE(2), 0); CM_Add_Res_Des(&rd2, lc, ResType_IO, &Res2, SIZEOF_IORANGE(2), 0); CM_Register_Device_Driver(DevNode, ConfigHandler, 0); // Allocate per instance data return(CR_SUCCESS); }