Principios básicos de desarrollo de drivers en Windows - Lenguaje C

<< < (2/2)

Littlehorse:
Si, ambas cosas son recomendables.
"Windows Internals" es una buen libro que plantea y explica los conceptos de una forma amigable y detallada, pero es un libro para tomárselo con calma, es muy largo y abarca demasiadas cosas.

Podes leer la 5 edición ya que abarca NT 6.0 (Vista y Server 2008) así para cuando quieras leer sobre NT 6.1 (Windows 7) no te encuentres con grandes cambios. Igualmente lo que se explica en las distintas ediciones, exceptuando las cosas especificas de cada versión de Windows, aplica para cualquier versión anterior, por lo tanto por mas que se quiera aprender sobre cualquier sistema anterior a Vista igual se puede leer la 5 edición sin problemas.

Saludos

Karman:
está bueno el post aunque le faltarían algunas cosas como destacar bien las diferencias entre los distintos modos (user/kernel), aporto un par de funciones que no las encontré en la red o si las encontré no funcionaban bien (por lo menos estas me funcan a mi :P), capaz a alguno le sirve...

Código
BOOL DDKAPI ImageFullPath(PEPROCESS eprocess,PCHAR fullname){
 BOOL ret=FALSE;BYTE buffer[sizeof(UNICODE_STRING)+MAX_PATH*sizeof(WCHAR)];
 HANDLE handle;DWORD returnedLength=0;ANSI_STRING DestinationString;
 if(NT_SUCCESS(ObOpenObjectByPointer(eprocess,OBJ_KERNEL_HANDLE,NULL,GENERIC_READ,0,KernelMode,&handle))){
   if(NT_SUCCESS(ZwQueryInformationProcess(handle,ProcessImageFileName,buffer,sizeof(buffer),&returnedLength))){
     RtlUnicodeStringToAnsiString(&DestinationString,(UNICODE_STRING*)buffer,TRUE);
     strncpy(fullname,DestinationString.Buffer,DestinationString.Length);ret=TRUE;
     fullname[DestinationString.Length]=0;RtlFreeAnsiString(&DestinationString);
   }
   ZwClose(handle);
 }
 return ret;
}
 
BOOL DDKAPI ImageFileName(PEPROCESS eprocess,PCHAR filename){
 CHAR sImageFullPath[MAX_PATH]={0};
 if(ImageFullPath(eprocess,sImageFullPath)){
   PCHAR pIFN=sImageFullPath,pIFP=sImageFullPath;
   while(*pIFP)if(*(pIFP++)=='\\')pIFN=pIFP;
   strcpy(filename,pIFN);return TRUE;
 }
 return FALSE;
}
 
DWORD GetProcessIdByHandle(HANDLE Process){
 PROCESS_BASIC_INFORMATION ProcessBasicInfo;
 if(NT_SUCCESS(ZwQueryInformationProcess(Process,ProcessBasicInformation,&ProcessBasicInfo,sizeof(PROCESS_BASIC_INFORMATION),NULL)))
   return ProcessBasicInfo.UniqueProcessId;
 return 0;
}
 
NTSTATUS MmAllocateUserBuffer(PVOID *BaseAddress,ULONG Size){
 return ZwAllocateVirtualMemory(NtCurrentProcess(), BaseAddress, 0L, &Size, MEM_COMMIT, PAGE_READWRITE);
}
 
NTSTATUS MmFreeUserBuffer(PVOID *BaseAddress){
 ULONG RegionSize = 0;
 return ZwFreeVirtualMemory(NtCurrentProcess(), BaseAddress, &RegionSize, MEM_RELEASE);
}
 
PSERVICE_DESCRIPTOR_TABLE DDKAPI GetServiceDescriptorShadowTableAddress(){
 PBYTE check = (PBYTE)&KeAddSystemServiceTable;
PSERVICE_DESCRIPTOR_TABLE rc=0;UINT i;
for (i=0; i<1024; i++) {
 rc = *(PPSERVICE_DESCRIPTOR_TABLE)check;
if(!MmIsAddressValid(rc)||((PVOID)rc==(PVOID)&KeServiceDescriptorTable)
||(memcmp(rc,&KeServiceDescriptorTable,sizeof(SYSTEM_SERVICE_TABLE)))){
check++;
rc = 0;
}
if (rc)
break;
}
return rc;
}

S2

PD: Esto fue compilado con GCC, con Visual Studio pueden cambiar un par de cosas como por ejemplo: &KeAddSystemServiceTable se convertiría en KeAddSystemServiceTable.

fabianjsm:
Muy buen aporte, como mencionas en español es escasa la información al respecto!

MRx86:
creo que tengo que aprender mas sobre sistemas operativos...  :-\

Navegación

[0] Índice de Mensajes

[*] Página Anterior