구동 기호 링크 삭제 오류 - 변수 역할 영역 및 RtlInitUnicodeString 문제
1870 단어 unicode
요약: 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()을 사용할 때는 주의해야 할 것 같습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JS의 문자열에서 베트남어 문자 제거텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.