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.
307 lines
6.1 KiB
307 lines
6.1 KiB
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
|
|
Module Name:
|
|
|
|
scappdev
|
|
|
|
Abstract:
|
|
|
|
This module provides the device-specific operations that must be performed
|
|
by the controlling resource manager application. Due to Plug 'n Play, there
|
|
can't be a clean separation between device controller classes and the
|
|
application driving them. This module provides the hooks to isolate these
|
|
interdependencies as much as possible.
|
|
|
|
Author:
|
|
|
|
Doug Barlow (dbarlow) 4/3/1998
|
|
|
|
Environment:
|
|
|
|
Win32, C++
|
|
|
|
Notes:
|
|
|
|
?Notes?
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
#include <winsvc.h>
|
|
#include <dbt.h>
|
|
#include <scardlib.h>
|
|
#include <calmsgs.h>
|
|
#include "SvrApp.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
static const GUID l_guidSmartcards
|
|
= { // 50DD5230-BA8A-11D1-BF5D-0000F805F530
|
|
0x50DD5230,
|
|
0xBA8A,
|
|
0x11D1,
|
|
{ 0xBF, 0x5D, 0x00, 0x00, 0xF8, 0x05, 0xF5, 0x30 } };
|
|
|
|
static HANDLE l_hService = NULL;
|
|
static DWORD l_dwType = 0;
|
|
static HDEVNOTIFY l_hIfDev = NULL;
|
|
|
|
|
|
/*++
|
|
|
|
AppInitializeDeviceRegistration:
|
|
|
|
This routine is called by a controlling application in order to enable
|
|
PnP and Power Management Events.
|
|
|
|
Arguments:
|
|
|
|
hService supplies the handle to the service application.
|
|
|
|
dwType supplies the type of handle supplied.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
Author:
|
|
|
|
Doug Barlow (dbarlow) 4/3/1998
|
|
|
|
--*/
|
|
|
|
void
|
|
AppInitializeDeviceRegistration(
|
|
HANDLE hService,
|
|
DWORD dwType)
|
|
{
|
|
|
|
//
|
|
// Platform-specific initialization.
|
|
//
|
|
|
|
ASSERT(NULL == l_hService);
|
|
DEV_BROADCAST_DEVICEINTERFACE dbcIfFilter;
|
|
|
|
|
|
//
|
|
// Save off the application information.
|
|
//
|
|
|
|
l_hService = hService;
|
|
l_dwType = dwType;
|
|
|
|
|
|
//
|
|
// Register for PnP events.
|
|
//
|
|
|
|
ZeroMemory(&dbcIfFilter, sizeof(dbcIfFilter));
|
|
dbcIfFilter.dbcc_size = sizeof(dbcIfFilter);
|
|
dbcIfFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
|
|
// dbcIfFilter.dbcc_reserved = NULL;
|
|
CopyMemory(
|
|
&dbcIfFilter.dbcc_classguid,
|
|
&l_guidSmartcards,
|
|
sizeof(GUID));
|
|
// dbcIfFilter.dbcc_name[1];
|
|
|
|
l_hIfDev = RegisterDeviceNotification(
|
|
l_hService,
|
|
&dbcIfFilter,
|
|
l_dwType);
|
|
if (NULL == l_hIfDev)
|
|
{
|
|
CalaisWarning(
|
|
DBGT("Initialize device registration failed to register for PnP events: %1"),
|
|
GetLastError());
|
|
}
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
AppTerminateDeviceRegistration:
|
|
|
|
This routine is called by a controlling application in order to terminate
|
|
PnP and Power Management Events.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
Author:
|
|
|
|
Doug Barlow (dbarlow) 4/3/1998
|
|
|
|
--*/
|
|
|
|
void
|
|
AppTerminateDeviceRegistration(
|
|
void)
|
|
{
|
|
|
|
//
|
|
// Platform-specific initialization.
|
|
//
|
|
|
|
BOOL fSts;
|
|
|
|
|
|
//
|
|
// Unregister for PnP events.
|
|
//
|
|
|
|
if (NULL != l_hIfDev)
|
|
{
|
|
fSts = UnregisterDeviceNotification(l_hIfDev);
|
|
if (!fSts)
|
|
{
|
|
CalaisWarning(
|
|
DBGT("Terminate device registration failed to unregister from PnP events: %1"),
|
|
GetLastError());
|
|
}
|
|
}
|
|
|
|
l_hService = NULL;
|
|
l_dwType = 0;
|
|
l_hIfDev = NULL;
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
AppRegisterDevice:
|
|
|
|
This routine is called by a Reader Device Object to inform the controlling
|
|
application that it exists and is ready to follow the OS rules for removal.
|
|
|
|
Arguments:
|
|
|
|
hReader supplies the handle to the open device.
|
|
|
|
szReader supplies the name of the device.
|
|
|
|
ppvAppState supplies a pointer to a storage location for this application
|
|
associated with this device. The use of this location is specific to
|
|
the application.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
Author:
|
|
|
|
Doug Barlow (dbarlow) 4/3/1998
|
|
|
|
--*/
|
|
|
|
void
|
|
AppRegisterDevice(
|
|
HANDLE hReader,
|
|
LPCTSTR szReader,
|
|
LPVOID *ppvAppState)
|
|
{
|
|
|
|
//
|
|
// Platform-specific initialization.
|
|
//
|
|
|
|
DEV_BROADCAST_HANDLE dbcHandleFilter;
|
|
HDEVNOTIFY *phDevNotify = (HDEVNOTIFY *)ppvAppState;
|
|
|
|
|
|
//
|
|
// Register for PnP events.
|
|
//
|
|
|
|
ASSERT(NULL == *phDevNotify);
|
|
ZeroMemory(&dbcHandleFilter, sizeof(dbcHandleFilter));
|
|
dbcHandleFilter.dbch_size = sizeof(dbcHandleFilter);
|
|
dbcHandleFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
|
|
dbcHandleFilter.dbch_handle = hReader;
|
|
|
|
*phDevNotify = RegisterDeviceNotification(
|
|
l_hService,
|
|
&dbcHandleFilter,
|
|
l_dwType);
|
|
if (NULL == *phDevNotify)
|
|
{
|
|
CalaisWarning(
|
|
DBGT("Register device failed to register '%2' for PnP Device removal: %1"),
|
|
GetLastError(),
|
|
szReader);
|
|
}
|
|
}
|
|
|
|
|
|
/*++
|
|
|
|
AppUnregisterDevice:
|
|
|
|
This routine is called when a device wants to let the controlling
|
|
application know that it is officially ceasing to exist.
|
|
|
|
Arguments:
|
|
|
|
hReader supplies the handle to the open device.
|
|
|
|
szReader supplies the name of the device.
|
|
|
|
ppvAppState supplies a pointer to a storage location for this application
|
|
associated with this device. The use of this location is specific to
|
|
the application.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
Author:
|
|
|
|
Doug Barlow (dbarlow) 4/3/1998
|
|
|
|
--*/
|
|
|
|
void
|
|
AppUnregisterDevice(
|
|
HANDLE hReader,
|
|
LPCTSTR szReader,
|
|
LPVOID *ppvAppState)
|
|
{
|
|
|
|
|
|
//
|
|
// Platform-specific initialization.
|
|
//
|
|
|
|
BOOL fSts;
|
|
HDEVNOTIFY *phDevNotify = (HDEVNOTIFY *)ppvAppState;
|
|
|
|
|
|
//
|
|
// Unregister from PnP events.
|
|
//
|
|
|
|
if (NULL != *phDevNotify)
|
|
{
|
|
fSts = UnregisterDeviceNotification(*phDevNotify);
|
|
if (!fSts)
|
|
{
|
|
CalaisWarning(
|
|
DBGT("Unregister device failed to unregister '%2' from PnP Device removal: %1"),
|
|
GetLastError(),
|
|
szReader);
|
|
}
|
|
}
|
|
}
|
|
|