00 NTSTATUS NewNtLoadDriver(IN PUNICODE_STRING DriverServiceName) 01 { 02 NTSTATUS status=STATUS_SUCCESS; 03 04 if (KeGetPreviousMode()!=KernelMode) 05 { 06 WCHAR *buffer=NULL; 07 08 __try 09 { 10 ProbeForRead(DriverServiceName,sizeof(UNICODE_STRING),1); 11 12 SIZE_T name_len=DriverServiceName->Length/sizeof(WCHAR); 13 ProbeForRead(DriverServiceName->Buffer,name_len*sizeof(WCHAR),2); 14 15 SIZET_T buf_len=(name_len+1)*sizeof(WCHAR); 16 buffer=(WCHAR*)ExAllocatePoolWithTag(NonPagedPool,buf_len,POOL_TAG); 17 if (buffer) 18 { 19 RtlZeroMemory(buffer,buf_len); 20 RtlCopyMemory(buffer,DriverServiceName->buffer,name_len*sizeof(WCHAR)); 21 22 WCHAR *drv_name=wcsrchr(buffer,L“\\“); 23 if (drv_name) drv_name++; 24 else drv_name=buffer; 25 26 SIZE_T drv_len=wcslen(drv_name); 27 28 PWSTR pattern=L“Ovladac“; 29 SIZE_T pat_len=wcslen(pattern); 30 31 if (pat_len==drv_len) 32 { 33 UNICODE_STRING pattern_name; 34 RtlInitUnicodeString(&pattern_name,pattern); 35 36 UNICODE_STRING driver_name; 37 RtlInitUnicodeString(&driver_name,drv_name); 38 39 if (RtlCompareUnicodeString(&pattern_name,&driver_name,TRUE)==0) 40 status=STATUS_ACCESS_DENIED; 41 } 42 } else status=STATUS_INSUFFICIENT_RESOURCES; 43 } __except (EXCEPTION_EXECUTE_HANDLER) 44 { 45 status=STATUS_INVALID_PARAMETER; 46 } 47 48 if (buffer) 49 ExFreePoolWithTag(buffer); 50 51 if (!NT_SUCCESS(status)) 52 return status; 53 } 54 55 status=OldNtLoadDriver(DriverServiceName); 56 57 return status; 58 }