Leaked source code of windows server 2003
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.
 
 
 
 
 
 

256 lines
7.7 KiB

//-------------------------------------------------------------------
// This is main object
// It starts all life of the system.
// Author: Sergey Ivanov
// Log:
// 06/08/99 - implemented
//-------------------------------------------------------------------
/**********************************************************/
#ifndef __KERNEL__
#define __KERNEL__
// System includes
#include "generic.h"
// Objects supported by the kernel
// Client side
#include "device.h"
#include "system.h"
#include "memory.h"
#include "irp.h"
#include "event.h"
#include "semaphore.h"
#include "int.h"
#include "power.h"
#include "debug.h"
#include "logger.h"
#include "lock.h"
#include "reader.h"
#include "interface.h"
#include "protocol.h"
#include "smartcard.h"
#include "rdrconfig.h"
#include "iopack.h"
#include "timer.h"
/**********************************************************/
#pragma LOCKEDCODE
class CGBus;
class CChild;
class CUSBDevice;
class CUSBReader;
class CKernel;
class CDevice;
class CReaderInterface;
/*
There is only one instance of the class CKernel
*/
class CKernel
{
public:
NTSTATUS m_Status;
SAFE_DESTRUCTORS();
virtual VOID dispose(VOID);
public:
~CKernel(VOID){};
// Return the kernel object.
static CKernel* loadWDMKernel(VOID);
static CKernel* loadNT4Kernel(VOID);
static CKernel* loadWin9xKernel(VOID);
LONG getSystemType(VOID){return systemtype;};
CDebug* getDebug(VOID){return debug;};
CLogger* getLogger(VOID){return logger;};
#ifdef USBREADER_PROJECT
#ifndef USBDEVICE_PROJECT
#define USBDEVICE_PROJECT
#endif
#endif
// This is kernel system objects factory
#ifdef USBDEVICE_PROJECT
static CUSBDevice* createUSBDevice(VOID);
#endif
#ifdef USBREADER_PROJECT
static CUSBReader* createUSBReader(VOID);
#endif
#ifdef BUS_PROJECT
static CDevice* createBus(VOID);
static CDevice* createChild(CGBus* parent,LONG instanceID);
static CDevice* createChild(CGBus* parent,IN PUNICODE_STRING DeviceName,LONG instanceID);
#endif
// Objects driver can create
static CSystem* createSystem(VOID);
static CMemory* createMemory(VOID);
static CIrp* createIrp(VOID);
static CEvent* createEvent(VOID);
static CSemaphore* createSemaphore(VOID);
static CInterrupt* createInterrupt(VOID);
static CPower* createPower(VOID);
static CLock* createLock(VOID);
static CDebug* createDebug(VOID);
static CTimer* createTimer(TIMER_TYPE Type);
// Creates interface to comminicate with reader...
static CReaderInterface* createReaderInterface(LONG interfaceType,LONG protocolType,CDevice* device);
static CLogger* createLogger(VOID);
// Device registration function
// Register device at driver
static VOID registerObject(PDEVICE_OBJECT fdo,CDevice* dev);
static VOID unregisterObject(PDEVICE_OBJECT fdo);
static CDevice* getRegisteredDevice(PDEVICE_OBJECT fdo);
public:
CUString* RegistryPath;
// Linked list of device objects
static CLinkedList<CDevice> *DeviceLinkHead;
private:
static LONG systemtype;
static LONG refcount;
static CDebug* debug;
static CLogger* logger;
private:
CKernel(){};
};
typedef enum _SYSTEM_TYPE_
{
WDM_SYSTEM = 1,
NT4_SYSTEM,
WIN9X_SYSTEM
} SYSTEM_TYPE;
#define CALLBACK_FUNCTION(f) ::f
#define DECLARE_CALLBACK_VOID0(f) VOID f(PDEVICE_OBJECT pDO)
#define DECLARE_CALLBACK_BOOL0(f) BOOL f(PDEVICE_OBJECT pDO)
#define DECLARE_CALLBACK_LONG0(f) NTSTATUS f(PDEVICE_OBJECT pDO)
// functions which take two argument
#define DECLARE_CALLBACK_VOID1(f,type) VOID f(PDEVICE_OBJECT pDO,type arg)
#define DECLARE_CALLBACK_LONG1(f,type) NTSTATUS f(PDEVICE_OBJECT pDO,type arg)
// functions which can take three argument
#define DECLARE_CALLBACK_LONG2(f,type1,type2) NTSTATUS f(PDEVICE_OBJECT pDO,type1 arg1, type2 arg2)
//C wrapper for the DPC function
#define DECLARE_CALLBACK_DPCR(fname,type1,type2) VOID fname(PKDPC Dpc, PDEVICE_OBJECT pDO,type1 arg1, type2 arg2)
#define DECLARE_CALLBACK_ISR(fname) BOOL fname(struct _KINTERRUPT *Interrupt,PDEVICE_OBJECT pDO)
// This will be used to create callback functions
//#define CDEVICE(pDo) ((CDevice*)pDo->DeviceExtension)
inline CDevice* getObjectPointer(PDEVICE_OBJECT pDo)
{
//DBG_PRINT("Object %8.8lX was called\n",pDo);
if(!pDo || !pDo->DeviceExtension)
{
DBG_PRINT("\n****** ERROR! Device %8.8lX ????, CDevice %8.8lX>>> ",pDo,pDo->DeviceExtension);
return NULL; // Object was removed...
}
ULONG type = ((CDevice*)pDo->DeviceExtension)->m_Type;
switch(type)
{
case USB_DEVICE:
{
//DBG_PRINT("\nUSB_DEVICE %8.8lX >>> ",(CDevice*)((CUSBDevice*)pDo->DeviceExtension));
return ((CDevice*)((CUSBDevice*)pDo->DeviceExtension)); break;
}
case USBREADER_DEVICE:
{
//DBG_PRINT("\nUSBREADER_DEVICE %8.8lX >>> ",(CDevice*)((CUSBReader*)pDo->DeviceExtension));
return ((CDevice*)((CUSBReader*)pDo->DeviceExtension)); break;
}
default:
DBG_PRINT("\n****** ERROR! Device %8.8lX ????, CDevice %8.8lX>>> ",pDo,pDo->DeviceExtension);
return ((CDevice*)pDo->DeviceExtension);
}
};
#define CDEVICE(pDo) getObjectPointer(pDo)
// functions which take one argument -> device object
#define IMPLEMENT_CALLBACK_VOID0(f) \
VOID f(PDEVICE_OBJECT pDO)\
{if(CDEVICE(pDO)) CDEVICE(pDO)->f();}
#define IMPLEMENT_CALLBACK_BOOL0(f) \
BOOL f(PDEVICE_OBJECT pDO) \
{if(!CDEVICE(pDO)) return FALSE; return CDEVICE(pDO)->f();}
#define IMPLEMENT_CALLBACK_LONG0(f) \
NTSTATUS f(PDEVICE_OBJECT pDO) \
{if(!CDEVICE(pDO)) return STATUS_INVALID_HANDLE; return CDEVICE(pDO)->f();}
// functions which take two argument
#define IMPLEMENT_CALLBACK_VOID1(f,type)\
VOID f(PDEVICE_OBJECT pDO,type arg)\
{if(CDEVICE(pDO)) CDEVICE(pDO)->f(arg);}
#define IMPLEMENT_CALLBACK_LONG1(f,type) \
NTSTATUS f(PDEVICE_OBJECT pDO,type arg)\
{if(!CDEVICE(pDO)) return STATUS_INVALID_HANDLE; return CDEVICE(pDO)->f(arg);}
// functions which can take three argument
#define IMPLEMENT_CALLBACK_LONG2(f,type1,type2)\
NTSTATUS f(PDEVICE_OBJECT pDO,type1 arg1, type2 arg2)\
{if(!CDEVICE(pDO)) return STATUS_INVALID_HANDLE; return CDEVICE(pDO)->f(arg1, arg2);}
//C wrapper for the DPC function
#define IMPLEMENT_CALLBACK_DPCR(fname,type1,type2) \
VOID fname(PKDPC Dpc, PDEVICE_OBJECT pDO,type1 arg1, type2 arg2)\
{if(CDEVICE(pDO)) CDEVICE(pDO)->DpcForIsr(Dpc, arg1,arg2);}
#define IMPLEMENT_CALLBACK_ISR(fname) \
BOOL fname(struct _KINTERRUPT *Interrupt,PDEVICE_OBJECT pDO)\
{if(CDEVICE(pDO)) return CDEVICE(pDO)->fname();}
//A global reference to the one and only kernel object
extern CKernel* kernel;
// System side
// WDM system
#ifdef WDM_KERNEL
#include "wdmsys.h"
#include "wdmmem.h"
#include "wdmirp.h"
#include "wdmevent.h"
#include "wdmsem.h"
#include "wdmint.h"
#include "wdmlock.h"
#include "wdmpower.h"
#include "wdmdebug.h"
#include "wdmlog.h"
#include "wdmtimer.h"
//#include "wdmdev.h"
#endif
// Specific supported devices
//#include "usbdev.h"
#pragma LOCKEDCODE
// Declare used device callbacks...
#ifndef _DEVICE_CALLBACKS_
#define _DEVICE_CALLBACKS_
DECLARE_CALLBACK_LONG1(open,IN PIRP);
DECLARE_CALLBACK_LONG1(close,IN PIRP);
DECLARE_CALLBACK_LONG1(read,IN PIRP);
DECLARE_CALLBACK_LONG1(write,IN PIRP);
DECLARE_CALLBACK_VOID1(startIo,IN PIRP);
DECLARE_CALLBACK_LONG1(deviceControl,IN PIRP);
DECLARE_CALLBACK_LONG1(flush,IN PIRP);
DECLARE_CALLBACK_LONG1(cleanup,IN PIRP);
DECLARE_CALLBACK_LONG1(powerRequest,IN PIRP);
NTSTATUS pnpRequest(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
DECLARE_CALLBACK_VOID1(cancelPendingIrp,IN PIRP);
VOID onSendDeviceSetPowerComplete(PDEVICE_OBJECT junk, UCHAR fcn, POWER_STATE state, PPOWER_CONTEXT context, PIO_STATUS_BLOCK pstatus);
#endif
#endif//KERNEL