Tenes que exponer alguna interfaz al usuario(programador) para que pueda consultar por el estado de la operación y/o ejecutar cierta función del usuario cuando la misma se completa (una callback function) y eventualmente permitir cancelar una operacion asincrónica y a veces se permite "sincronizar" la operación (es decir llamar al SO para que el thread de usuario se bloquee hasta que la operación termine).
Además en general este tipo de operaciones va sobre bloques de datos, por lo que precisas un buffer y el largo del mismo.
Eventualmente si se hace una copia de buffers entre el espacio de direccionamiento del proceso y del kernel tenes que mantener las estructuras para poder hacer dicha copia cuando termina la operación.
En todos los casos se tiene que poder determinar si la operacion terminó con éxito o no.
Saludos,
Gustavo