정보: Windows NT 드라이버 개발자를--작업 피하기 위한 팁

기술 자료 번역 기술 자료 번역
기술 자료: 186775 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

요약

다음과 같은 Windows NT 장치 드라이버를 만드는 몇 가지 팁이 있습니다. 제시된 팁 모든 기술을 적용합니다. 이 검사 목록으로 드라이버 문제를 해결하는 데 사용할 수도 있습니다.

Windows NT 아키텍처의 기본 지식 및 아래에 제시된 효과적으로 정보를 사용하여 발생할 일부 장치 드라이버 개발 있어야 합니다. 장치 드라이버 개발에 대한 자세한 내용은 MSDN Professional 구성원을 통해 사용 가능한 Windows NT 장치 드라이버를 키트를 (DDK를)를 참조하십시오.

추가 정보

개발자는 Windows NT 장치 드라이버와 작업할 때 안 작업 목록을 다음과가 같습니다.

  1. (IoMarkIrpPending) 보류 중인 I/O 요청 패킷 (IRP) 표시 없이 디스패치 루틴에서 절대로 반환 STATUS_PENDING.
  2. 절대로 KeSynchronizeExecution에서 인터럽트 서비스 루틴 호출 (ISR). 시스템 교착 상태가 됩니다.
  3. 절대로 플래그-> DeviceObject DO_BUFFERED_IO 및 DO_DIRECT_IO 설정하십시오. 시스템이 혼동하지 및 결국 심각한 오류가 발생할 수 있습니다. 이러한 값은 IOCTL을 정의하는 데 사용되기 때문에 또한 절대로 METHOD_BUFFERED, METHOD_NEITHER, METHOD_IN_DIRECT 또는 METHOD_OUT_DIRECT DeviceObject 플래그,-> 설정하십시오.
  4. 절대로 페이징된 풀에서 발송자 개체를 할당하십시오. 그럴 경우 경우에 따라 시스템 bugchecks를 발생합니다.
  5. 절대로 페이징된 풀에서 메모리를 할당하는 또는 IRQL에서 실행하는 동안 페이징된 풀 메모리 액세스 > = DISPATCH_LEVEL. 치명적인 오류가 있습니다.
  6. 결코 0이 아닌 간격으로 IRQL 커널 발송자 개체에서 기다리는 > = DISPATCH_LEVEL. 치명적인 오류가 있습니다.
  7. 모든 함수 호출이 호출 스레드가 직접 또는 간접적으로 IRQL에서 실행하는 동안 잠시 기다려 인해지 않습니다 > = DISPATCH_LEVEL. 치명적인 오류가 있습니다.
  8. 절대로 최상위 루틴을 호출할 때 어떤 수준 아래의 인터럽트 요청 수준 (IRQL) 낮춥니다.
  9. 절대로 KeRaiseIrql() 호출되지 않은 경우 KeLowerIrql()를 호출하십시오.
  10. 절대로 프로세서 (KeStallExecutionProcessor) 50 마이크로초 것보다 더 주차칸.
  11. 절대로 필요한 것보다 더 스핀 잠금을 보유합니다. 전반적인 시스템 성능을 향상시키려면 25 마이크로초 것보다 더 시스템 전반에 걸친 스핀 잠금을 보유하지 않습니다.
  12. 절대로 KeAcquireSpinLock 또는 KeAcquireSpinLockAtDpcLevel 및 KeReleaseSpinLock, KeReleaseSpinLockFromDpcLevel, DISPATCH_LEVEL 보다 큰 IRQL 실행하는 동안 호출하십시오.
  13. 절대로 원래 IRQL 복원할 수 있기 때문에 호출 KeReleaseSpinLockFromDpcLevel에 의해 KeAcquireSpinLock 함께 획득된 스핀 잠금을 해제하십시오.
  14. 절대로 KeAcquireSpinLock 및 KeReleaseSpinLock 또는 집행 스핀 잠금 ISR 또는 SynchCritSection routine(s)에서 사용하는 다른 루틴을 호출하십시오.
  15. DriverEntry 이외의 루틴에서 장치 개체를 만들 때 DO_DEVICE_INITIALIZING 플래그를 지우려면 절대 잊지.
  16. 절대로 KeInsertQueueDpc 사용하여 지연된 프로시저 호출 (DPC) 개체의 여러 스레드가 다른 프로세서에서 동시에 큐에 저장됩니다. 치명적인 오류가 생길 수 있습니다.
  17. 절대로 CutomerTimerDPC 루틴에서 정기 타이머를 할당을 취소하십시오. 비연속 타이머 DPC 루틴을 통해 할당을 취소할 수 있습니다.
  18. 절대, KeSetTimer 또는 KeSetTimerEx 같은 DPC 포인터를 전달할 (CustomTimerDpc) 및 KeInsertQueueDpc (CustomDpc)이 때문에 경쟁 조건.
  19. 절대로 IoStartNextPacket 스핀 잠금을 보유하는 동안 호출하십시오. 시스템 교착 상태가 발생할 수 있습니다.
  20. 절대로 IoCompleteRequest 스핀 잠금을 보유하는 동안 호출하십시오. 시스템 교착 상태가 발생할 수 있습니다.
  21. 드라이버 완료 루틴 설정하는 경우 완료 루틴 NULL로 설정하지 않고 IoCompleteRequest 절대로 호출하십시오.
  22. IoCompleteRequest 호출하기 전에 입출력 상태 블록 내의 IRP 설정하려면 절대 잊지.
  23. 절대로 IoMarkPending 있는 IRP 큐 또는 다른 드라이버 (IoCallDriver) 보내는 후에 호출하십시오. 해당 IRP IoMarkPending 드라이버를 호출하고 오류 검사 후 발생할 수 전에 완료할 수 있습니다. -> PendingReturned Irp 설정된 경우 완성 루틴 사용하여 드라이버 완료 루틴 IoMarkPending을 호출해야 합니다.
  24. 결코 이를 IoCompleteRequest 호출된 후 있는 IRP 터치.
  25. 절대로 IoCancelIrp 있는 IRP 아직 완료되지 않은 것을 알 수 없는 경우 해당 드라이버에서 소유한 IRP를 호출하십시오.
  26. 절대로 IoCancelIrp에 대한 디스패치 루틴을 호출자에게 반환될 때까지 디스패치 루틴을 작업 IRP 호출하십시오.
  27. 절대로 중간 드라이버 낮은 드라이버의 IRP를 만들려면 IoMakeAssociatedIrp를 호출하십시오. 사용자의 중간 드라이버를 얻을 IRP 관련된 IRP 수 있으며 이미 연결된 IRP 다른 IRP에 연결할 수 없습니다.
  28. 절대로 호출을 수행할 수 있도록 설정된 IRP IoMakeAssociatedIrp I/O 버퍼링된.
  29. 가상 장치 I/O 레지스터가 가리키는 포인터가 역참조하고 액세스할 안 됩니다. 항상 올바른 하드웨어 추상화 계층 (HAL) 함수의 장치를 액세스할 수 있습니다.
  30. 절대로 DISPATCH_LEVEL에서 수정할 수 있는 ISR IRP 또는 장치 개체 필드를 액세스하십시오. 대칭 다중 프로세서 시스템에서 이로 인해 데이터가 손상될 수 있습니다.
  31. 절대로 낮은 IRQL 코드에 의해 데이터가 기록될 수 있습니다 높은 IRQL에서 실행하는 동안 데이터를 수정하십시오. KeSynchronizeExecution 루틴을 사용하십시오.
  32. (있을 경우) 절대로 드라이버 고유의 스핀 잠금 중 하나를 DispatchCleanup 루틴에서 (IoAcquireCancelSpinLock) 시스템 전반에 걸친 취소 스핀 잠금을 얻은 전에 취득하십시오. 드라이버 전체에서 일관된 잠금 획득이 계층 구조를 따르면 잠재적 교착 상태를 피하기 위해 필수적입니다.
  33. 절대로 시스템에 항상 호출되므로 취소 루틴 IoAcquireCancelSpinLock 스핀 잠금 취소 호출 대신 보유한.
  34. 취소 루틴을 반환하기 전에 IoReleaseCancelSpinLock 호출하려면 절대 잊지.
  35. 이 단일 프로세서 시스템에서만 사용할 수 있기 때문에 IRQL 기반 동기화를 사용하지 마십시오. 한 프로세서에서 IRQL 발생시키는 다른 프로세서에서 인터럽트 마스크 있지 않습니다.
  36. 겹쳐진된 메모리 주소 범위를 RtlCopyMemory를 사용하지 마십시오. 사용 RtlMoveMemory.
  37. 절대로 페이지 크기를 상수, 주어진된 CPU에 대한 경우에도 가정하십시오. 사용 PAGE_SIZE 및 기타 관련된 상수를 이식성 유지하려면 헤더 파일에 정의된 페이지.
  38. 절대로 Boot\System 초기화 단계에서 로드된 드라이버의 DriverEntry 루틴을 Registry\Machine\Hardware 및 Registry\Machine\System 아닌 다른 레지스트리 키를 액세스하십시오.
  39. 절대로 운전 레지스트리 키 (Registry\Machine\System\CurrentControlSet\Services) 에서 드라이버를 로드하는 Enum 키를 만듭니다. 시스템에 이 키를 동적으로 만듭니다.
  40. 절대로 실제 장치에 필요한 버스 상대 I/O 포트, 메모리 범위, 인터럽트, 또는 직접 메모리 액세스 (DMA) 주장하는 없이 초기화할 시도가 채널/레지스트리의 하드웨어 리소스 먼저 포트.
  41. IoRegisterDriverReinitialization DriverEntry에서 호출할 절대로 일상적인 않으면 STATUS_SUCCESS 반환합니다.
  42. 절대로 KeSetEvent Wait 매개 변수 집합으로 TRUE 로 페이징할 수 있는 스레드 또는 IRQL PASSIVE_LEVEL 때 실행되는 페이징할 수 있는 드라이버 루틴을 호출하십시오. 사용자의 루틴을 체크 KeWait KeSetEvent에 대한 호출을 사이의 페이징할 수 발생하면 심각한 페이지 부재를 이 호출 형식의 발생합니다.개체입니다.
  43. 절대로 KeReleaseSemaphore Wait 매개 변수 집합으로 TRUE 로 페이징할 수 있는 스레드 또는 IRQL PASSIVE_LEVEL 때 실행되는 페이징할 수 있는 드라이버 루틴을 호출하십시오. 사용자의 루틴을 체크 KeWait KeReleaseSemaphore에 대한 호출을 사이의 페이징할 수 경우이 호출 형식의 심각한 페이지 부재 인해 object(s).
  44. 절대로 KeReleaseMutex Wait 매개 변수 집합으로 TRUE 로 페이징할 수 있는 스레드 또는 IRQL PASSIVE_LEVEL 때 실행되는 페이징할 수 있는 드라이버 루틴을 호출하십시오. 사용자의 루틴을 체크 KeWait KeReleaseMutex에 대한 호출을 사이의 페이징할 수 경우이 호출 형식의 심각한 페이지 부재 인해 object(s).
  45. 절대로 KeBugCheckEx 또는 KeBugCheck 시스템 상태로 정품 Windows NT 드라이버를 호출하는, 오류가 발생한 경우가 아니면 있는 시스템 메모리가 손상되었거나 결국 오류 검사 시스템에 인해 중대한 오류입니다. 항상 오류 조건을 정상적으로 처리할 보십시오.
  46. 절대로 모든 어떤 특정 IoTimer 때 루틴을 호출할 간격으로 궁극적으로 시스템 시계 해상도에 따라 달라지므로 1초 경계에 정확하게 IoTimer 루틴이 호출될 것을 가정하십시오.
  47. 절대로 Win32s가 응용 프로그래밍 인터페이스 (API) 에서 커널 모드 장치 드라이버를 호출하십시오.
  48. 스택 커널 모드에서 실행되는 동안 호출 스레드를 커널 모드 스택 동적으로 증가 않는 때문에 오버플로가 발생할 수 있는 절대 사용 재귀 함수.
  49. 절대로 있는 ISR 가져올 인터럽트 개체의 주소를 항상 IoConnectInterrupt에서 받은 것과 수 없기 때문에 둘 이상의 인터럽트 처리하는 인터럽트 개체 포인터를 (PKINTERRUPT)는 ISR 인터럽트를 식별할 수 있습니다. IoConnectInterrupt에서 지정한 ServiceContext 값을 하나만 사용해야 하는 현재 인터럽트 장치를 식별합니다.
  50. 절대로 CustomTimerDpc (KeCancelTimer) 지우지 않고 드라이버를 언로드하십시오. 드라이버가 언로드된 후에 해당 DPC 발생되기 경우 존재하지 않는 비코드 방문 횟수 및 오류 검사 시스템에 발생할 수 있습니다.
  51. 그 안에 설정할 드라이버 I/O CompletionRoutine 있는 모든 IRP에 때까지 드라이버 언로드 완료되지 않습니다. 드라이버 언로드된 후에 해당 IRP 낮은 드라이버에 의해 완료된 가져옵니다 경우 시스템에 존재하지 않는 코드를 실행하고 시스템을 손상시키는 시도할 수 있습니다.
  52. 드라이버 처리할 준비가 될 때까지 장치 인터럽트를 사용해서는 안 됩니다. 드라이버를 완전히 초기화된 ISR 및 DPC 드라이버의 내부 구조가 터치 시스템 안전합니다 후에 사용해야 합니다.
  53. 교착 상태가 발생할 수 있으므로 한 스핀록 채 드라이버 외부에서 호출 마십시오.
  54. 사후 처리를 I/O 관리자에 의해 관련된 I/O CompletionRoutine 있는 IRP 완료를 위해 준비되지 않았기 때문에 IoBuildAsynchronousFsdRequest/IoAllocateIrp 드라이버로 만든 IRP에 대한 데이터를 STATUS_MORE_PROCESSING_REQUIRED 아닌 다른 모든 상태 절대로 반환. 이러한 IRP 명시적으로 해제해야 합니다 (IoFreeIrp) 드라이버가. 다시 사용하기 위해 해당 IRP 의미하는 경우 이를 에 CompletionRoutine STATUS_MORE_PROCESSING_REQUIRED 상태 반환하기 전에 해제될 수 있습니다.
  55. 해당 IRP (Irp) ThreadListEntry-> 스레드와 관련된 남아 있으므로 임의 스레드 컨텍스트에서 IoBuildSynchronousFsdRequest/IoBuildDeviceIoControlRequest 함께 IRP 절대로 할당할 때까지 해제되지 않습니다.
  56. 절대로 IoInitializeIrp에 대해 할당된 IRP IoAllocateIrp 함께 ChargeQuota 매개 변수 TRUE로 사용하여 호출하십시오. TRUE 로 ChargeQuota 설정된 IRP 할당할 때 I/O 관리자를 있는 메모리에 있는 IRP 내부 플래그 IRP에 대해 할당된 풀에 대한 정보를 유지합니다.

    IoInitializeIrp IRP를 호출하면 이 함수는 전체 IRP 무턱대고 0 을 같이 할당 풀 정보가 손실됩니다. 해당 IRP 약속 때 메모리 손상이 발생합니다. 또한 절대로 IO 관리자에서 제공되는 IRP를 다시 사용하십시오. IRP 다시 사용하려는 경우에는 직접 IoAllocateIrp 사용하여 할당한 합니다.
  57. 절대로 개체 호출 스레드 스택에 할당된 경우 WaitMode KeWaitForSingleObject/KeWaitForMultipleObjects UserMode 지정해야 합니다. 이 필연적으로 대기한 것에 대한 개체 함수는 스택을 만든 경우 사용자가 KernelMode 체크 페이지된 스레드 스택을 않도록 WaitMode로 합니다 있다는 점입니다.
  58. 중요 섹션에 있는 코드를 보호하지 않고 사용자 모드 스레드 컨텍스트에서 ERESOURCES 및 FastMutex(Unsafe) 같은 리소스를 절대로 취득하십시오.

    스레드가 있는 APC 큐 작업이 일시 중단된 경우 이러한 리소스가 획득되었음을 APC_LEVEL, 위해 IRQL 발생시킬 때문에 리소스를 확보한 후에 시스템 보안 교착 상태 및 손상을 일으킬 수. 따라서 KeEnterCriticalRegion 호출하여 중 하나가 명시적으로 APC_LEVEL 또는 IRQL 발생시키는 중요 섹션에 이러한 리소스를 얻으려고 합니다.

참조

Windows NT용 MSDN 장치 드라이버 디자인 가이드

속성

기술 자료: 186775 - 마지막 검토: 2004년 7월 27일 화요일 - 수정: 2.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Win32 Device Driver Kit for Windows NT 3.51
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
키워드:?
kbmt kbinfo KB186775 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
더 이상 지원되지 않는 제품의 KB 내용에 대한 고지 사항
이 문서에서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 설명합니다. 따라서 이 문서는 "있는 그대로" 제공되며 업데이트되지 않습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com