642 lines
14 KiB
C
642 lines
14 KiB
C
/*
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
fsp_dtp.c
|
||
|
||
Abstract:
|
||
|
||
This module contains the entry points for the AFP desktop APIs queued to
|
||
the FSP. These are all callable from FSP Only.
|
||
|
||
Author:
|
||
|
||
Jameel Hyder (microsoft!jameelh)
|
||
|
||
|
||
Revision History:
|
||
25 Apr 1992 Initial Version
|
||
|
||
Notes: Tab stop: 4
|
||
--*/
|
||
|
||
#define FILENUM FILE_FSP_DTP
|
||
|
||
#include <afp.h>
|
||
#include <gendisp.h>
|
||
#include <fdparm.h>
|
||
#include <pathmap.h>
|
||
#include <client.h>
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text( PAGE, AfpFspDispAddIcon)
|
||
#pragma alloc_text( PAGE, AfpFspDispGetIcon)
|
||
#pragma alloc_text( PAGE, AfpFspDispGetIconInfo)
|
||
#pragma alloc_text( PAGE, AfpFspDispAddAppl)
|
||
#pragma alloc_text( PAGE, AfpFspDispGetAppl)
|
||
#pragma alloc_text( PAGE, AfpFspDispRemoveAppl)
|
||
#pragma alloc_text( PAGE, AfpFspDispAddComment)
|
||
#pragma alloc_text( PAGE, AfpFspDispGetComment)
|
||
#pragma alloc_text( PAGE, AfpFspDispRemoveComment)
|
||
#endif
|
||
|
||
/*** AfpFspDispAddIcon
|
||
*
|
||
* This is the worker routine for the AfpAddIcon API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Creator
|
||
* sda_ReqBlock DWORD Type
|
||
* sda_ReqBlock DWORD IconType
|
||
* sda_ReqBlock DWORD IconTag
|
||
* sda_ReqBlock LONG BitmapSize
|
||
* sda_ReplyBuf BYTE[] IconBuffer
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispAddIcon(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
AFPSTATUS Status = AFP_ERR_PARAM;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _Creator;
|
||
DWORD _Type;
|
||
DWORD _IconType;
|
||
DWORD _IconTag;
|
||
LONG _Size;
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispAddIcon: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc));
|
||
|
||
ASSERT(VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
|
||
if (pSda->sda_IOSize > 0)
|
||
{
|
||
ASSERT(pSda->sda_IOBuf != NULL);
|
||
|
||
Status = AfpAddIcon(pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
pReqPkt->_Creator,
|
||
pReqPkt->_Type,
|
||
pReqPkt->_IconTag,
|
||
pReqPkt->_Size,
|
||
pReqPkt->_IconType,
|
||
pSda->sda_IOBuf);
|
||
AfpFreeIOBuffer(pSda);
|
||
}
|
||
|
||
return Status;
|
||
}
|
||
|
||
|
||
/*** AfpFspDispGetIcon
|
||
*
|
||
* This is the worker routine for the AfpGetIcon API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Creator
|
||
* sda_ReqBlock DWORD Type
|
||
* sda_ReqBlock DWORD IconType
|
||
* sda_ReqBlock LONG Length of buffer
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispGetIcon(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
AFPSTATUS Status = AFP_ERR_PARAM;
|
||
LONG ActualLength;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _Creator;
|
||
DWORD _Type;
|
||
DWORD _IconType;
|
||
LONG _Length;
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispGetIcon: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
if (pReqPkt->_Length >= 0)
|
||
{
|
||
pSda->sda_ReplySize = (USHORT)pReqPkt->_Length;
|
||
if (pReqPkt->_Length > (LONG)pSda->sda_MaxWriteSize)
|
||
pSda->sda_ReplySize = (USHORT)pSda->sda_MaxWriteSize;
|
||
|
||
if ((pSda->sda_ReplySize == 0) ||
|
||
((pSda->sda_ReplySize > 0) &&
|
||
(Status = AfpAllocReplyBuf(pSda)) == AFP_ERR_NONE))
|
||
{
|
||
if ((Status = AfpLookupIcon(pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
pReqPkt->_Creator,
|
||
pReqPkt->_Type,
|
||
pReqPkt->_Length,
|
||
pReqPkt->_IconType,
|
||
&ActualLength,
|
||
pSda->sda_ReplyBuf)) != AFP_ERR_NONE)
|
||
{
|
||
Status = AFP_ERR_ITEM_NOT_FOUND;
|
||
}
|
||
else
|
||
{
|
||
pSda->sda_ReplySize = (USHORT)ActualLength;
|
||
}
|
||
}
|
||
}
|
||
|
||
return Status;
|
||
}
|
||
|
||
|
||
/*** AfpFspDispGetIconInfo
|
||
*
|
||
* This is the worker routine for the AfpGetIconInfo API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Creator
|
||
* sda_ReqBlock LONG Icon index
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispGetIconInfo(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
LONG Size;
|
||
DWORD Type,
|
||
Tag;
|
||
DWORD IconType;
|
||
AFPSTATUS Status = AFP_ERR_PARAM;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _Creator;
|
||
DWORD _Index;
|
||
};
|
||
struct _ResponsePacket
|
||
{
|
||
BYTE __IconTag[4];
|
||
BYTE __Type[4];
|
||
BYTE __IconType;
|
||
BYTE __Pad;
|
||
BYTE __Size[2];
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispGetIconInfo: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
if ((Status = AfpLookupIconInfo(pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
pReqPkt->_Creator,
|
||
pReqPkt->_Index,
|
||
&Type,
|
||
&IconType,
|
||
&Tag,
|
||
&Size)) == AFP_ERR_NONE)
|
||
{
|
||
pSda->sda_ReplySize = SIZE_RESPPKT;
|
||
if ((Status = AfpAllocReplyBuf(pSda)) == AFP_ERR_NONE)
|
||
{
|
||
PUTDWORD2DWORD(&pRspPkt->__IconTag, Tag);
|
||
RtlCopyMemory(&pRspPkt->__Type, (PBYTE)&Type, sizeof(DWORD));
|
||
PUTSHORT2BYTE(&pRspPkt->__IconType, IconType);
|
||
PUTDWORD2SHORT(&pRspPkt->__Size, Size);
|
||
}
|
||
}
|
||
|
||
return Status;
|
||
}
|
||
|
||
|
||
/*** AfpFspDispAddAppl
|
||
*
|
||
* This is the worker routine for the AfpAddAppl API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Directory Id
|
||
* sda_ReqBlock DWORD Creator
|
||
* sda_ReqBlock DWORD APPL Tag
|
||
* sda_Name1 ANSI_STRING PathName
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispAddAppl(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
FILEDIRPARM FDParm;
|
||
PATHMAPENTITY PME;
|
||
AFPSTATUS Status = AFP_ERR_PARAM;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _DirId;
|
||
DWORD _Creator;
|
||
DWORD _ApplTag;
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispAddAppl: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
AfpInitializePME(&PME, 0, NULL);
|
||
if ((Status = AfpMapAfpPathForLookup(pReqPkt->_pConnDesc,
|
||
pReqPkt->_DirId,
|
||
&pSda->sda_Name1,
|
||
pSda->sda_PathType,
|
||
DFE_FILE,
|
||
FILE_BITMAP_FILENUM |
|
||
FD_INTERNAL_BITMAP_OPENACCESS_WRITE,
|
||
&PME,
|
||
&FDParm)) == AFP_ERR_NONE)
|
||
{
|
||
AfpIoClose(&PME.pme_Handle); // only needed to check for RW access
|
||
|
||
Status = AfpAddAppl(pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
pReqPkt->_Creator,
|
||
pReqPkt->_ApplTag,
|
||
FDParm._fdp_AfpId,
|
||
False,
|
||
FDParm._fdp_ParentId);
|
||
}
|
||
|
||
return Status;
|
||
}
|
||
|
||
|
||
/*** AfpFspDispGetAPPL
|
||
*
|
||
* This is the worker routine for the AfpGetAppl API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Creator
|
||
* sda_ReqBlock DWORD APPL Index
|
||
* sda_ReqBlock DWORD Bitmap
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispGetAppl(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
DWORD ApplTag;
|
||
DWORD Bitmap, // Need to copy this as it goes into the resp
|
||
FileNum, ParentID;
|
||
AFPSTATUS Status = AFP_ERR_PARAM;
|
||
FILEDIRPARM FDParm;
|
||
PATHMAPENTITY PME;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _Creator;
|
||
DWORD _Index;
|
||
DWORD _Bitmap;
|
||
};
|
||
struct _ResponsePacket
|
||
{
|
||
BYTE __Bitmap[2];
|
||
BYTE __ApplTag[4];
|
||
// Followed by the File Parameters. These cannot be represented as a
|
||
// structure since it depends on the bitmap
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispGetAppl: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
Bitmap = pReqPkt->_Bitmap;
|
||
AfpInitializePME(&PME, 0, NULL);
|
||
|
||
do
|
||
{
|
||
if ((Status = AfpLookupAppl(pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
pReqPkt->_Creator,
|
||
pReqPkt->_Index,
|
||
&ApplTag, &FileNum, &ParentID)) != AFP_ERR_NONE)
|
||
break;
|
||
|
||
AfpInitializeFDParms(&FDParm);
|
||
|
||
// Call AfpMapAfpPathForLookup on the parent ID first to make sure
|
||
// its files are cached in.
|
||
if (ParentID != 0)
|
||
{
|
||
ANSI_STRING nullname = {0, 0, NULL};
|
||
|
||
if ((Status = AfpMapAfpPathForLookup(pReqPkt->_pConnDesc,
|
||
ParentID,
|
||
&nullname,
|
||
AFP_LONGNAME,
|
||
DFE_DIR,
|
||
0, // Bitmap
|
||
NULL,
|
||
NULL)) != AFP_ERR_NONE)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
if ((Status = AfpMapAfpIdForLookup(pReqPkt->_pConnDesc,
|
||
FileNum,
|
||
DFE_FILE,
|
||
Bitmap | FD_INTERNAL_BITMAP_OPENACCESS_READ,
|
||
&PME, // open a handle to check access
|
||
&FDParm)) != AFP_ERR_NONE)
|
||
break;
|
||
|
||
pSda->sda_ReplySize = SIZE_RESPPKT +
|
||
EVENALIGN(AfpGetFileDirParmsReplyLength(&FDParm, Bitmap));
|
||
|
||
if ((Status = AfpAllocReplyBuf(pSda)) == AFP_ERR_NONE)
|
||
{
|
||
AfpPackFileDirParms(&FDParm, Bitmap,
|
||
pSda->sda_ReplyBuf + SIZE_RESPPKT);
|
||
PUTDWORD2SHORT(pRspPkt->__Bitmap, Bitmap);
|
||
PUTDWORD2DWORD(pRspPkt->__ApplTag, ApplTag);
|
||
}
|
||
|
||
} while (False);
|
||
|
||
if (PME.pme_Handle.fsh_FileHandle != NULL)
|
||
AfpIoClose(&PME.pme_Handle);
|
||
|
||
return Status;
|
||
}
|
||
|
||
|
||
/*** AfpFspDispRemoveAppl
|
||
*
|
||
* This is the worker routine for the AfpRemoveAppl API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Directory Id
|
||
* sda_ReqBlock DWORD Creator
|
||
* sda_Name1 ANSI_STRING PathName
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispRemoveAppl(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
FILEDIRPARM FDParm;
|
||
PATHMAPENTITY PME;
|
||
AFPSTATUS Status = AFP_ERR_PARAM;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _DirId;
|
||
DWORD _Creator;
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispRemoveAppl: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
AfpInitializePME(&PME, 0, NULL);
|
||
if ((Status = AfpMapAfpPathForLookup(pReqPkt->_pConnDesc,
|
||
pReqPkt->_DirId,
|
||
&pSda->sda_Name1,
|
||
pSda->sda_PathType,
|
||
DFE_FILE,
|
||
FILE_BITMAP_FILENUM |
|
||
FD_INTERNAL_BITMAP_OPENACCESS_READWRITE,
|
||
&PME,
|
||
&FDParm)) == AFP_ERR_NONE)
|
||
{
|
||
AfpIoClose(&PME.pme_Handle); // only needed to check access
|
||
|
||
Status = AfpRemoveAppl(pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
pReqPkt->_Creator,
|
||
FDParm._fdp_AfpId);
|
||
}
|
||
|
||
return Status;
|
||
}
|
||
|
||
|
||
/*** AfpFspDispAddComment
|
||
*
|
||
* This is the worker routine for the AfpAddComment API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Directory Id
|
||
* sda_Name1 ANSI_STRING PathName
|
||
* sda_Name2 ANSI_STRING Comment
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispAddComment(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
PATHMAPENTITY PME;
|
||
FILEDIRPARM FDParm;
|
||
AFPSTATUS Status;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _DirId;
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispAddComment: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
AfpInitializePME(&PME, 0, NULL);
|
||
if ((Status = AfpMapAfpPathForLookup(pReqPkt->_pConnDesc,
|
||
pReqPkt->_DirId,
|
||
&pSda->sda_Name1,
|
||
pSda->sda_PathType,
|
||
DFE_ANY,
|
||
0,
|
||
&PME,
|
||
&FDParm)) == AFP_ERR_NONE)
|
||
{
|
||
Status = AFP_ERR_VOLUME_LOCKED;
|
||
if (IS_CONN_NTFS(pReqPkt->_pConnDesc))
|
||
Status = AfpAddComment(pSda,
|
||
pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
&pSda->sda_Name2,
|
||
&PME,
|
||
IsDir(&FDParm),
|
||
FDParm._fdp_AfpId);
|
||
AfpIoClose(&PME.pme_Handle);
|
||
}
|
||
return Status;
|
||
}
|
||
|
||
|
||
/*** AfpFspDispGetComment
|
||
*
|
||
* This is the worker routine for the AfpGetComment API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Directory Id
|
||
* sda_Name1 ANSI_STRING PathName
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispGetComment(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
PATHMAPENTITY PME;
|
||
FILEDIRPARM FDParm;
|
||
AFPSTATUS Status;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _DirId;
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispGetComment: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
AfpInitializePME(&PME, 0, NULL);
|
||
if ((Status = AfpMapAfpPathForLookup(pReqPkt->_pConnDesc,
|
||
pReqPkt->_DirId,
|
||
&pSda->sda_Name1,
|
||
pSda->sda_PathType,
|
||
DFE_ANY,
|
||
0,
|
||
&PME,
|
||
&FDParm)) == AFP_ERR_NONE)
|
||
{
|
||
// Assume no comment to start with
|
||
Status = AFP_ERR_ITEM_NOT_FOUND;
|
||
|
||
if (IS_CONN_NTFS(pReqPkt->_pConnDesc) &&
|
||
(FDParm._fdp_Flags & DFE_FLAGS_HAS_COMMENT))
|
||
{
|
||
pSda->sda_ReplySize = AFP_MAXCOMMENTSIZE + 1;
|
||
|
||
if ((Status = AfpAllocReplyBuf(pSda)) == AFP_ERR_NONE)
|
||
{
|
||
if ((Status = AfpGetComment(pSda,
|
||
pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
&PME,
|
||
IsDir(&FDParm))) != AFP_ERR_NONE)
|
||
{
|
||
AfpFreeReplyBuf(pSda, FALSE);
|
||
}
|
||
}
|
||
}
|
||
AfpIoClose(&PME.pme_Handle);
|
||
}
|
||
|
||
return Status;
|
||
}
|
||
|
||
|
||
/*** AfpFspDispRemoveComment
|
||
*
|
||
* This is the worker routine for the AfpRemoveComment API.
|
||
*
|
||
* The request packet is represented below
|
||
*
|
||
* sda_ReqBlock PCONNDESC pConnDesc
|
||
* sda_ReqBlock DWORD Directory Id
|
||
* sda_Name1 ANSI_STRING PathName
|
||
*/
|
||
AFPSTATUS FASTCALL
|
||
AfpFspDispRemoveComment(
|
||
IN PSDA pSda
|
||
)
|
||
{
|
||
PATHMAPENTITY PME;
|
||
FILEDIRPARM FDParm;
|
||
AFPSTATUS Status = AFP_ERR_ITEM_NOT_FOUND;
|
||
struct _RequestPacket
|
||
{
|
||
PCONNDESC _pConnDesc;
|
||
DWORD _DirId;
|
||
};
|
||
|
||
PAGED_CODE( );
|
||
|
||
DBGPRINT(DBG_COMP_AFPAPI_DTP, DBG_LEVEL_INFO,
|
||
("AfpFspDispRemoveComment: Entered\n"));
|
||
|
||
ASSERT(VALID_CONNDESC(pReqPkt->_pConnDesc) &&
|
||
VALID_VOLDESC(pReqPkt->_pConnDesc->cds_pVolDesc));
|
||
|
||
AfpInitializePME(&PME, 0, NULL);
|
||
if (IS_CONN_NTFS(pReqPkt->_pConnDesc) &&
|
||
(Status = AfpMapAfpPathForLookup(pReqPkt->_pConnDesc,
|
||
pReqPkt->_DirId,
|
||
&pSda->sda_Name1,
|
||
pSda->sda_PathType,
|
||
DFE_ANY,
|
||
0,
|
||
&PME,
|
||
&FDParm)) == AFP_ERR_NONE)
|
||
{
|
||
Status = AFP_ERR_ITEM_NOT_FOUND;
|
||
if (IS_CONN_NTFS(pReqPkt->_pConnDesc) &&
|
||
(FDParm._fdp_Flags & DFE_FLAGS_HAS_COMMENT))
|
||
Status = AfpRemoveComment(pSda,
|
||
pReqPkt->_pConnDesc->cds_pVolDesc,
|
||
&PME,
|
||
IsDir(&FDParm),
|
||
FDParm._fdp_AfpId);
|
||
AfpIoClose(&PME.pme_Handle);
|
||
}
|
||
|
||
return Status;
|
||
}
|
||
|
||
|