Kayaker
October 15th, 2008, 00:46
I'm afraid the answer is still the same, you're going to have to learn to interpret the disassembly.
"IRP_MJ_READ and other most routines were the same"
If you're saying what I think you're saying, all the IRP_MJ_ MajorFunction routines may point to a single dispatch routine which uses a switch statement to direct the code, like:
Code:
// Dispatch on MajorFunction
switch (IrpStack->MajorFunction)
{
// Default these two IRPs
case IRP_MJ_CREATE:
case IRP_MJ_CLOSE:
break;
case IRP_MJ_READ:
...
case IRP_MJ_DEVICE_CONTROL:
Interpret this and you should find IRP_MJ_READ. Secondary option - use Softice DRIVER command to find address of IRP_MJ_READ.
At a minimum, you should learn about the IRP structure and incorporate the named field definitions into your IDA disassembly. Definition of fields such as Irp->MdlAddress or Irp->AssociatedIrp.SystemBuffer for example are very useful pointers to data transfer.
Do yourself a favor and read the first google hits of both Msdn and Osronline for 'IRP_MJ_READ'. Then give yourself some time to learn a bit about driver programming. Get the DDK and look up the API's the driver uses.
For your specific case, if your driver is communicating with usermode, you might be looking for a shared user MDL mapping. Just a big chunk of bytes that undergoes what looks like a decryption routine. A little digging you might be able to find it.
Kayaker