Ejemplo n.º 1
0
kern_return_t OsqueryStart(kmod_info_t *ki, void *d) {
  dbg_printf("Kernel module starting!\n");

  // Restart the queue and setup queue locks.
  // This does not allocate, share, or set the queue buffer or buffer values.
  osquery_cqueue_setup(&osquery.cqueue);

  // Initialize the IOCTL (and more) device node.
  osquery.major_number = cdevsw_add(osquery.major_number, &osquery_cdevsw);
  if (osquery.major_number < 0) {
    dbg_printf("Could not get a major number!\n");
    goto error_exit;
  }

  // Create the IOCTL (and more) device node.
  osquery.devfs = devfs_make_node(makedev(osquery.major_number, 0),
                                  DEVFS_CHAR,
                                  UID_ROOT,
                                  GID_WHEEL,
                                  0600,
                                  "osquery",
                                  0);
  if (osquery.devfs == NULL) {
    dbg_printf("Could not get a devfs entry!\n");
    goto error_exit;
  }

  // Set up the IOCTL and kernel API locks (not queue locks).
  setup_locks();

  return KERN_SUCCESS;
error_exit:
  // Upon error, remove the device node if it was allocated.
  if (osquery.devfs != NULL) {
    devfs_remove(osquery.devfs);
    osquery.devfs = NULL;
  }

  // Tear down device node data.
  if (!(osquery.major_number < 0)) {
    if (cdevsw_remove(osquery.major_number, &osquery_cdevsw) < 0) {
      panic("osquery kext: Cannot remove osquery from cdevsw");
    }
  }

  // Reset the queue and remove the queue locks.
  osquery_cqueue_teardown(&osquery.cqueue);
  return KERN_FAILURE;
}
Ejemplo n.º 2
0
kern_return_t OsqueryStart(kmod_info_t *ki, void *d) {
    dbg_printf("Kernel module starting!\n");

    osquery_cqueue_setup(&osquery.cqueue);

    osquery.major_number = cdevsw_add(osquery.major_number, &osquery_cdevsw);
    if (osquery.major_number < 0) {
        dbg_printf("Could not get a major number!\n");
        goto error_exit;
    }

    osquery.devfs = devfs_make_node(makedev(osquery.major_number, 0),
                                    DEVFS_CHAR, UID_ROOT, GID_WHEEL,
                                    0644, "osquery", 0);
    if (osquery.devfs == NULL) {
        dbg_printf("Could not get a devfs entry!\n");
        goto error_exit;
    }

    setup_locks();

    return KERN_SUCCESS;
error_exit:
    if (osquery.devfs != NULL) {
        devfs_remove(osquery.devfs);
        osquery.devfs = NULL;
    }

    if (!(osquery.major_number < 0)) {
        if (cdevsw_remove(osquery.major_number, &osquery_cdevsw) < 0) {
            panic("osquery kext: Cannot remove osquery from cdevsw");
        }
    }

    osquery_cqueue_teardown(&osquery.cqueue);
    return KERN_FAILURE;
}