1 대 다수의 관계 (단일 드라이버에 연결된 여러 클라이언트를 의미)가있는 IOKit 기본 드라이버/데몬 프로젝트가 있습니다.일부 클라이언트가 연결되지 않은 경우 "kextunload"에서 IOKit 드라이버가 다운되지 않도록하십시오.
코어 드라이버는 IOService
에서 파생 된 IOKit 개체이며 IOUserClient
에서 파생 된 드라이버 클라이언트 공급자이기도합니다. 그들은 사용자 공간 클라이언트의 에이전트입니다 (사용자 공간 클라이언트 당 하나)
내 목표는 kextunload
명령의 경우 루트 권한으로 드라이버를 언로드하는 것을 방지하기위한 것이 었습니다. 마지막 클라이언트가 연결을 끊을 때 (프로세스 종료 또는 내가/postphone을 해제 할 필요가 명령을 IOKit 내용을 확인하기 위해) 수동
을 kextunload
을 할 필요없이, 드라이버가 (자동으로 종료됩니다) IOServiceClose
전화, 나는 basid에게 관련 인쇄 메시지 IOService
콜백을 포장했습니다 두 클라이언트가 연결된 kextunload
을 실행하는 시나리오에서 로그를 관찰했습니다.
kernel: (driver) virtual bool com_osxkernel_driver::terminate(IOOptionBits)
kernel: (driver) virtual bool com_osxkernel_driverClient::terminate(IOOptionBits)
kernel: (driver) virtual bool com_osxkernel_driverClient::terminate(IOOptionBits)
kernel: (driver) virtual void com_osxkernel_driverClient::stop(IOService *)
kernel: (driver) virtual void com_osxkernel_driverClient::stop(IOService *)
kernel: (driver) virtual void com_osxkernel_driver::stop(IOService *)
-
내가 그 제공의 각IOUserClient
에서 참조 및
IOUserClient::clientClose
에 그 참조를 해제를 취할 경우에도
kextunload
명령이 계속 성공할 것으로 보인다
.
내 목표를 달성하기 위해 찾은 유일한 방법은 ::terminate
명령을 연기하고이를 ::clientClose
에서 명시 적으로 호출하는 것입니다.
그래서 IOService::terminate
에 대한 호출을 제거하고 대신 IOUserClient::clientClose()
에서 호출했습니다. 다음은 관련 코드 : 성공 및 드라이버 언로드의 타이밍을 제어에서 kextunload
을 방지 어떤 덜 해키 방법이 있는지
IOReturn com_osxkernel_driverClient::clientClose()
{
myProvider->release();
return super::terminate(kIOServiceSynchronous) ? kIOReturnSuccess : kIOReturnError;
}
bool com_osxkernel_driverClient::terminate(IOOptionBits options) {
os_log_info(g_logger,"%s", __PRETTY_FUNCTION__);
return true;
}
내가 알고 싶습니다.
감사
도움을 주셔서 감사합니다. .. 단지 kextnuload의 소스 코드를 찾았습니까? 아마도 여기에 링크를 게시 할 수 있습니까? – osxUser
@osxUser 답변에 kextunload 소스 링크를 추가했습니다. – pmdj