احاول تغيير بعض اعدادات الملف بعد فتحه او انشائه بإستخدام NtCreateFile او NtOpenFile قمت بكتابة الداله التاليه و التى تقوم بتعديل حالة الحذف بعد الإغلاق للملف
bool __stdcall SetDeleteStatusAPI(IN HANDLE hFile, IN bool Status)
{
IO_STATUS_BLOCK IoStatusBlock;
FILE_MODE_INFORMATION ModeInfo;
// get file mode information
NTSTATUS RetStatus = NtQueryInformationFile
(hFile, &IoStatusBlock, &ModeInfo,
sizeof(ModeInfo), FileModeInformation);
// check status
if (!NT_SUCCESS(RetStatus))
{
SetLastError(RtlNtStatusToDosError(RetStatus));
return false;
}
// set delete status depending on input value
if (Status)
ModeInfo.Mode |= DELETE;
else
ModeInfo.Mode &= ~DELETE;
// set file mode information
RetStatus = NtSetInformationFile(hFile, &IoStatusBlock,
&ModeInfo, sizeof(ModeInfo),
FileModeInformation);
// if operation not succeded
if (!NT_SUCCESS(RetStatus))
{
SetLastError(RtlNtStatusToDosError(RetStatus));
return false;
}
/"520cooperation completed successfully
return true;
}المشكله انها الداله تفشل بإستمرار و القيمه المعاده دائما هى STATUS_INVALID_PARAMETER، لذا قمت بمراجعة الداله داخل وثائق WDK فلم اجد اى معلومات بخصوص امكانية تعديل الـ Mode Information لملف و لكنى لم ايأس فقمت بالبحث على الأنترنت فلم اجد شيئا حتى موقع مايكروسوفت لا يوفر معلومات كافيه لذا قمت بالحبث عن كود الداله NtSetInformationFile لويندوز 2000 و بعد ان وجدته و صلت لهذه الجزئيه
NTSTATUS
NtSetInformationFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
)
{
.
.
.
.
.
if (FileInformationClass == FileModeInformation) {
PFILE_MODE_INFORMATION modeBuffer = irp->AssociatedIrp.SystemBuffer;
//
// Set the various flags in the mode field for the file object, if
// they are reasonable. There are 4 different invalid combinations
// that the caller may not specify:
//
// 1) An invalid flag was set in the mode field. Not all Create/
// Open options may be changed.
//
// 2) The caller set one of the synchronous I/O flags (alert or
// nonalert), but the file is not opened for synchronous I/O.
//
// 3) The file is opened for synchronous I/O but the caller did
// not set either of the synchronous I/O flags (alert or non-
// alert).
//
// 4) The caller set both of the synchronous I/O flags (alert and
// nonalert).
//
if ((modeBuffer->Mode & ~FILE_VALID_SET_FLAGS) ||
((modeBuffer->Mode & (FSIO_A | FSIO_NA)) && (!(fileObject->Flags & FO_SYNCHRONOUS_IO))) ||
((!(modeBuffer->Mode & (FSIO_A | FSIO_NA))) && (fileObject->Flags & FO_SYNCHRONOUS_IO)) ||
(((modeBuffer->Mode & FSIO_A) && (modeBuffer->Mode & FSIO_NA) ))) {
status = STATUS_INVALID_PARAMETER;
} else {
//
// Set or clear the appropriate flags in the file object.
//
if (!(fileObject->Flags & FO_NO_INTERMEDIATE_BUFFERING)) {
if (modeBuffer->Mode & FILE_WRITE_THROUGH) {
fileObject->Flags |= FO_WRITE_THROUGH;
} else {
fileObject->Flags &= ~FO_WRITE_THROUGH;
}
}
if (modeBuffer->Mode & FILE_SEQUENTIAL_ONLY) {
fileObject->Flags |= FO_SEQUENTIAL_ONLY;
} else {
fileObject->Flags &= ~FO_SEQUENTIAL_ONLY;
}
if (fileObject->Flags & FO_SYNCHRONOUS_IO) {
if (modeBuffer->Mode & FSIO_A) {
fileObject->Flags |= FO_ALERTABLE_IO;
} else {
fileObject->Flags &= ~FO_ALERTABLE_IO;
}
}
status = STATUS_SUCCESS;
}
//
// Complete the I/O operation.
//
irp->IoStatus.Status = status;
irp->IoStatus.Information = 0L;
}
.
.
.
.
.
}هذا هو الجزء الوحيد المتعلق بـ الـ FileModeInformation و مع ذلك لا يظهر اى جزء فى الكود متعلق بإختبار حالة الـ Flag تجاه الـ Delete Mode.
قد يكون استعاجلى اعمى عيني عن امر ما (كالعاده :ph34r: ) لذا يمكنك تجربة الكود الخاص بى بالأعلى :excl: او يمكنك النظر لكود الداله NtStatus :blink: او يمكنك ان تتركنى هكذا اكاد احترق غيظا :mad: او يمكنك ان تقول لماذا لا تعمل دالتى العزيزه.
مسار الداله NtSetInformationFile بكود ويندوز 2000 فى المسار التالى
\win2k\private\ntos\io\qsinfo.c
و السلام عليكم
*************************************************************************
ينهار ابيض، الداله NtQueryInformationFile دائما بترجع الـ Mode بصفر ليه مش عارف حاولت معها بكذا طريقه دائما الـ Mode بصفر.
هووف !!! انا خلاص قرفت منها محدش يعرف طريقه احول بيها لينكس و ارتاح من دوال الـ Ntxx.