а как вообще использовать void* без знания конкретного типа?
Это наследие C. Как правило, там где есть такие штуки есть и аппарат для работы с ними. Тот же handle в винде - она знает как с ним обращаться, а пользователю достаточно знать что он есть.
Я вот вообще не понял, как это относится к изначальному разговору о виндовых дескрипторах
С ними так работают же - тебе не обязательно знать что в нем на самом деле (хотя часто это что-то осмысленное и полезное) - gdi-шные структуры например.