개체의 수명 주기

이 항목에서는 개체의 "수명 주기", 즉 개체 관리자가 개체를 참조하고 추적하는 방법에 대해 설명합니다. 이 항목에서는 개체를 임시 또는 영구적으로 만드는 방법도 설명합니다.

개체 참조 수

개체 관리자는 개체에 대한 참조 수의 수를 유지 관리합니다. 개체를 만들 때 개체 관리자는 개체의 참조 수를 1로 설정합니다. 해당 카운터가 0으로 떨어지면 개체가 해제됩니다.

드라이버는 개체 관리자가 조작하는 모든 개체에 대한 정확한 참조 수를 가지고 있는지 확인해야 합니다. 조기에 해제된 개체로 인해 시스템이 충돌할 수 있습니다. 참조 수가 실수로 높은 개체는 해제되지 않습니다.

개체는 핸들 또는 포인터로 참조할 수 있습니다. 개체 관리자는 참조 수 외에도 개체에 대한 열린 핸들 수의 수를 유지 관리합니다. 핸들을 여는 각 루틴은 개체 참조 수와 개체 핸들 수를 1씩 증가합니다. 이러한 루틴에 대한 각 호출은 ZwClose에 대한 해당 호출과 일치해야 합니다. 자세한 내용은 개체 핸들을 참조하세요.

커널 모드 내에서 개체에 대한 포인터로 개체를 참조할 수 있습니다. IoGetAttachedDeviceReference와 같은 개체에 대한 포인터를 반환하는 루틴은 참조 수를 1씩 늘입니다. 포인터를 사용하여 드라이버가 완료되면 ObDereferenceObject 를 호출하여 참조 수를 1씩 줄여야 합니다.

다음 루틴은 모두 개체의 참조 수를 하나씩 증가합니다.

ExCreateCallback

IoGetAttachedDeviceReference

IoGetDeviceObjectPointer

IoWMIOpenBlock

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

이전 루틴에 대해 수행한 각 호출은 ObDereferenceObject에 대한 해당 호출과 일치해야 합니다.

드라이버가 알려진 개체 포인터의 참조 수를 1씩 늘릴 수 있도록 ObReferenceObjectObReferenceObjectByPointer 루틴이 제공됩니다. ObReferenceObject 는 참조 수를 늘리기만 하면 됩니다. ObReferenceObjectByPointer는 참조 수를 늘리기 전에 액세스 검사 수행합니다.

ObReferenceObjectByHandle 루틴은 개체 핸들을 수신하고 기본 개체에 대한 포인터를 제공합니다. 참조 횟수도 1씩 증가합니다.

임시 및 영구 개체

대부분의 개체는 임시 개체입니다. 사용 중인 경우 개체 관리자가 해제합니다. 영구적 개체를 만들 수 있습니다. 개체가 영구적이면 개체 관리자 자체가 개체에 대한 참조를 보유합니다. 따라서 참조 횟수는 0보다 크며 개체가 더 이상 사용되지 않을 때 해제되지 않습니다.

임시 개체는 핸들 수가 0이 아닌 경우에만 이름으로 액세스할 수 있습니다. 핸들 수가 0으로 감소하면 개체의 이름이 개체 관리자의 네임스페이스에서 제거됩니다. 이러한 개체는 참조 수가 0보다 큰 경우 포인터로 계속 액세스할 수 있습니다. 영구 개체는 존재하는 한 이름으로 액세스할 수 있습니다.

개체를 만들 때 개체의 OBJECT_ATTRIBUTES 구조에서 OBJ_PERMANENT 특성을 지정하여 개체를 영구적으로 만들 수 있습니다. 자세한 내용은 InitializeObjectAttributes를 참조하세요.

영구 개체를 임시로 만들려면 ZwMakeTemporaryObject 루틴을 사용합니다. 이 루틴으로 인해 개체가 더 이상 사용되지 않으면 자동으로 삭제됩니다. 개체에 열린 핸들이 없으면 개체의 이름이 개체 관리자의 네임스페이스에서 즉시 제거됩니다. 개체 자체는 참조 수가 0으로 떨어질 때까지 유지됩니다.)