Source code of Windows XP (NT5)
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.
|
|
/*
Copyright (c) 1992 Microsoft Corporation
Module Name:
fsd_vol.c
Abstract:
This module contains the entry points for the AFP volume APIs. The API dispatcher calls these. These are all callable from FSD.
Author:
Jameel Hyder (microsoft!jameelh)
Revision History: 25 Apr 1992 Initial Version
Notes: Tab stop: 4 --*/
#define FILENUM FILE_FSD_VOL
#include <afp.h>
#include <gendisp.h>
/*** AfpFsdDispOpenVol
* * This routine implements the AfpOpenVol API. This completes here i.e. it is * not queued up to the Fsp. * * The request packet is represented below. * * sda_ReqBlock DWORD Bitmap * sda_Name1 ANSI_STRING VolName * sda_Name2 ANSI_STRING VolPassword OPTIONAL */ AFPSTATUS FASTCALL AfpFsdDispOpenVol( IN PSDA pSda ) { AFPSTATUS Status; struct _RequestPacket { DWORD _Bitmap; };
DBGPRINT(DBG_COMP_AFPAPI_VOL, DBG_LEVEL_INFO, ("AfpFsdDispOpenVol: Entered\n"));
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
if (pSda->sda_Name1.Length > AFP_VOLNAME_LEN) { return AFP_ERR_PARAM; }
pSda->sda_ReplySize = AfpVolumeGetParmsReplyLength(pReqPkt->_Bitmap, pSda->sda_Name1.Length);
if ((Status = AfpAllocReplyBuf(pSda)) == AFP_ERR_NONE) { if (((Status = AfpConnectionOpen(pSda, &pSda->sda_Name1, &pSda->sda_Name2, pReqPkt->_Bitmap, pSda->sda_ReplyBuf)) != AFP_ERR_NONE) && (Status != AFP_ERR_QUEUE)) { AfpFreeReplyBuf(pSda, FALSE); } }
// Change the worker routine if we need this to be queued.
if (Status == AFP_ERR_QUEUE) pSda->sda_WorkerRoutine = AfpFspDispOpenVol;
return Status; }
/*** AfpFsdDispCloseVol
* * This routine implements the AfpCloseVol API. This completes here i.e. it is * not queued up to the Fsp. * * The request packet is represented below. * * sda_ReqBlock PCONNDESC pConnDesc */ AFPSTATUS FASTCALL AfpFsdDispCloseVol( IN PSDA pSda ) { struct _RequestPacket { PCONNDESC _pConnDesc; };
DBGPRINT(DBG_COMP_AFPAPI_VOL, DBG_LEVEL_INFO, ("AfpFsdDispCloseVol: Entered\n"));
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) && VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
AfpConnectionClose(pReqPkt->_pConnDesc);
return AFP_ERR_NONE; }
/*** AfpFsdDispGetVolParms
* * This routine implements the AfpGetVolParms API. This completes here i.e. * it is not queued up to the Fsp. * * The request packet is represented below. * * sda_ReqBlock DWORD VolId * sda_ReqBlock DWORD Bitmap */ AFPSTATUS FASTCALL AfpFsdDispGetVolParms( IN PSDA pSda ) { AFPSTATUS Status = AFP_ERR_PARAM; PVOLDESC pVolDesc; struct _RequestPacket { PCONNDESC _pConnDesc; DWORD _Bitmap; };
DBGPRINT(DBG_COMP_AFPAPI_VOL, DBG_LEVEL_INFO, ("AfpFsdDispGetVolParms: Entered\n"));
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) && VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
pVolDesc = pReqPkt->_pConnDesc->cds_pVolDesc;
//
// we need to update the diskquota for this user, if diskquota is enabled:
// we are dpc here, so just queue this request
//
if (pVolDesc->vds_Flags & VOLUME_DISKQUOTA_ENABLED) { pSda->sda_WorkerRoutine = AfpFspDispGetVolParms; return(AFP_ERR_QUEUE); }
pSda->sda_ReplySize = AfpVolumeGetParmsReplyLength(pReqPkt->_Bitmap, pReqPkt->_pConnDesc->cds_pVolDesc->vds_MacName.Length);
if ((Status = AfpAllocReplyBuf(pSda)) == AFP_ERR_NONE) { AfpVolumePackParms(pSda, pVolDesc, pReqPkt->_Bitmap, pSda->sda_ReplyBuf); }
return Status; }
/*** AfpFsdDispSetVolParms
* * This routine implements the AfpSetVolParms API. This completes here i.e. * it is not queued up to the Fsp. * * The request packet is represented below. * * sda_ReqBlock PCONNDESC pConnDesc * sda_ReqBlock DWORD Bitmap * sda_ReqBlock DWORD BackupTime */ AFPSTATUS FASTCALL AfpFsdDispSetVolParms( IN PSDA pSda ) { struct _RequestPacket { PCONNDESC _pConnDesc; DWORD _Bitmap; DWORD _BackupTime; }; PVOLDESC pVolDesc;
DBGPRINT(DBG_COMP_AFPAPI_VOL, DBG_LEVEL_INFO, ("AfpFsdDispSetVolParms: Entered\n"));
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc));
pVolDesc = pReqPkt->_pConnDesc->cds_pVolDesc;
ASSERT(VALID_VOLDESC(pVolDesc) & !IS_VOLUME_RO(pVolDesc));
ACQUIRE_SPIN_LOCK_AT_DPC(&pVolDesc->vds_VolLock); pVolDesc->vds_BackupTime = pReqPkt->_BackupTime; pVolDesc->vds_Flags |= VOLUME_IDDBHDR_DIRTY; RELEASE_SPIN_LOCK_FROM_DPC(&pVolDesc->vds_VolLock);
return AFP_ERR_NONE; }
/*** AfpFsdDispFlush
* * This routine implements the AfpFlush API. The only thing done here is * validation of the Volume Id. The call completes here i.e. it is not * queued up to the FSP. * * The request packet is represented below. * * sda_ReqBlock DWORD VolId */ AFPSTATUS FASTCALL AfpFsdDispFlush( IN PSDA pSda ) { struct _RequestPacket { PCONNDESC _pConnDesc; };
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); DBGPRINT(DBG_COMP_AFPAPI_VOL, DBG_LEVEL_INFO, ("AfpFsdDispFlush: Entered\n"));
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) && VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
return AFP_ERR_NONE; }
|