구동 기호 링크 삭제 오류 - 변수 역할 영역 및 RtlInitUnicodeString 문제

1870 단어 unicode
키워드: 윈도우즈 드라이버 개발 삭제 기호 링크 오류 변수 역할 영역 문제 RtlInitUnicodeString
요약: NT 드라이브에서 DriverUnload()에서 이전에 만든 기호 링크를 삭제하려고 시도하는 데 실패했습니다. 마지막으로 변수 역할 영역과 RtlInitUnicodeString 문제가 발견되었습니다.
원래 문제가 있는 단순화 코드는 다음과 같습니다.
typedef struct _DEVICE_EXTENSION {
    UINT32 magicNum;
	PDEVICE_OBJECT pDevice;
	UNICODE_STRING symLinkName;	
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

PDEVICE_OBJECT gControlDeviceObject;

DriverEntry()
{
	PDEVICE_EXTENSION pDevExt;
	WCHAR             linkNameBuffer[]  = L"\\DosDevices\\diskFilter";
        UNICODE_STRING          LinkName;
	
	IoCreateDevice(..., &gControlDeviceObject);
	RtlInitUnicodeString (&LinkName, linkNameBuffer );
	
	pDevExt->magicNum = 0x4c44;
	pDevExt->symLinkName = LinkName;
	
	DriverObject->DriverUnload = DiskFilterUnload;
}

DiskFilterUnload (IN PDRIVER_OBJECT pDriverObject) 
{
	NTSTATUS status;
	PDEVICE_EXTENSION pDevExt;
	
	pDevExt = (PDEVICE_EXTENSION)gControlDeviceObject->DeviceExtension;
	KdPrint(("  devObj(0x%x), magicNum(0x%x), SymLinkName(%wZ)
", gControlDeviceObject, pDevExt->magicNum, &pDevExt->symLinkName)); status = IoDeleteSymbolicLink( &pDevExt->ustrSymLinkName ); }

위 코드에서 Io Delete SymbolicLink에서 되돌아오는 status는 경로가 정확하지 않지만 KdPrint에서 인쇄된magicNum은 정확합니다. windbg 디버깅에서 DiskFilter Unload () 의 pDevExt->symLinkName에 정확한 값이 포함되어 있지 않은 것을 발견했습니다. 당시에는 정말 이해할 수 없었습니다.
나중에 linkNameBuffer가 국부 변수라는 것을 보고 변수 작용역의 문제를 생각해서 WCHAR linkNameBuffer[]=L "\\DosDevices\\diskFilter"를DriverEntry 외부에 글로벌 변수를 가져오면,
문제가 사라졌다.물론 더 일반적인 방법은 헤더 파일의 #define SymbolicLinkName L "\\DosDevices\\diskFilter"입니다.
지금으로서는 이 문제가 발생하려면 Rtl Init Unicode String () 이 메모리 복사를 하지 않았을 것이다. (이것은 smLinkName에 메모리를 분배하고 값을 복사하지 않았지만, 나는 그것이 이렇게 했다고 생각한다.)
다음에 RtlInitUnicodeString()을 사용할 때는 주의해야 할 것 같습니다.

좋은 웹페이지 즐겨찾기