Kernel 在kext中为IOBlockStorageDevice查找我自己的BSD名称

Kernel 在kext中为IOBlockStorageDevice查找我自己的BSD名称,kernel,iokit,darwin,kernel-extension,Kernel,Iokit,Darwin,Kernel Extension,我认为这应该是一件很容易的事情,但现在我却在逃避。最 示例涉及“如果您有一个BSD名称/dev/disk,如何找到该设备”,而我刚刚注册了我的设备,希望找到它提供的BSD名称。Ie,/dev/disk2 我制定一个标准 class net_lundman_zfs_zvol : public IOService class net_lundman_zfs_zvol_device : public IOBlockStorageDevice 为新设备创建一个nub bool net_lundman_

我认为这应该是一件很容易的事情,但现在我却在逃避。最 示例涉及“如果您有一个BSD名称/dev/disk,如何找到该设备”,而我刚刚注册了我的设备,希望找到它提供的BSD名称。Ie,/dev/disk2

我制定一个标准

class net_lundman_zfs_zvol : public IOService
class net_lundman_zfs_zvol_device : public IOBlockStorageDevice
为新设备创建一个nub

bool net_lundman_zfs_zvol::createBlockStorageDevice (zvol_state_t *zv)
{
    net_lundman_zfs_zvol_device *nub = NULL;
    bool            result = false;
    nub = new net_lundman_zfs_zvol_device;
    if (nub == NULL)        goto bail;
    if (nub->init(zv) == false)        goto bail;
    if (nub->attach(this) == false)        goto bail;
    nub->registerService();
}
现在,我想知道我的新nub的BSD名称。这对我来说无关紧要 如果在net_lundman_zfs_zvol或net_lundman_zfs_zvol_设备中

我想我可以打个电话

 getProperty(kIOBSDNameKey);

但它总是空的。所以我可能必须找到我的
IOMedia*
,然后从那里调用
getProperty()

好的,所以我尝试的大多数事情都失败了,因为它们还没有连接。IOBlockStorage在决定插入什么之前,确实要经历一些事情。我仍然不知道是否有一个方法调用,或发送通知时,一切都是附加的。但是,我发现我可以调用
nub->registerService(kIOServiceSynchronous)使所有内容在返回前都已附加。然后a
nub->getBSDName()
可以递归调用bsdnameosbj=ioregdevice->getProperty(kIOBSDNameKey、gIOServicePlane、kioregistryiterated);