Ha svolto per molti anni l'attività di giudice istruttore impegnandosi in inchieste di criminalità mafiosa, economica ed eversiva. Tra l'altro, negli anni Settanta, ha istruito il primo processo sulle attività criminali di Cosa Nostra in Lombardia, che ha portato all'arresto del capomafia Luciano Liggio. Successivamente ha condotto insieme con Gherardo Colombo l'inchiesta giudiziaria milanese sulle vicende di Michele Sindona e sull'omicidio Ambrosoli, nel corso della quale vennero scoperti gli elenchi della Loggia massonica P2. È stato pubblico ministero al Tribunale internazionale dell'Aja per l'ex Iugoslavia e giudice della Corte suprema di cassazione. Insegna tecniche dell'investigazione all'Università Cattolica di Milano. Ha pubblicato alcuni manuali giuridici, tra cui Il delitto di associazione mafiosa (Giuffrè 2008). Con Gianni Simoni ha pubblicato anche Il caffè di Sindona. Un finanziere d'avventura tra politica, Vaticano e mafia (Garzanti 2009), Cesare Battisti, Storia di un'inchiesta (Garzanti 2019).